Великого мы в grupoly реализована такая система, что вы описываете.
Но вы думаете, что это неправильно, я приведу решение для всех, кому это нужно.
Прежде всего я хотел бы создать область в модели oferts, как это:
#ofert.rb
scope :are_ready_to_inactive, -> {
where(active: true).where('ends_at <= ?', Time.zone.now)
}
Так я supose у вас есть атрибут называется ends_at
таким образом мы получаем все oferts, что их ends_at
меньше, чем текущее время , это означает, что все оверты, которые истекли.
Тогда вам просто нужно создать реки задачу для инактивации всех тех oferts, которые истекли:
#lib/tasks/oferts.rake
namespace :oferts do
desc "Inactive oferts with cron on certain time"
task inactivatethem: :environment do
Ofert.are_ready_to_inactive.find_each do |ofert|
ofert.update_attributes active: false
end
end
end
Великой теперь, если вы запустите в консоли rake oferts:inactivatethem
вы инактивируете все oferts, которые уже истекли, вы можете делают запустить эти грабли задачу каждую минуту, например, используя драгоценный камень, как всякий раз, когда драгоценный камень
#config/schedule.rb
every 1.minute do
rake 'oferts:inactivatethem'
end
Теперь, если вам нужно отобразить обратный отсчет в реальном времени, вы можете использовать плагин JQuery, как jQueryCountDown, я думаю, что есть камень готов для ассе t, вам просто нужно следовать инструкциям.
Я хочу, чтобы вы поняли, что обратный отсчет является только «визуальным», это означает, что он предназначен только для пользователя, это таймер, который имеет только смысл на клиенте, в бэкэнд у вас есть своя задача, которая запускается каждую минуту для аортов, которые истекли и инактивировали их.
Я не дам вам подробностей о том, как показать таймер, потому что это просто материал jQuery.
Я надеюсь, что это поможет кому угодно.
вместо столбца 'active', почему бы не просто иметь какой-то столбец' end_date', который содержит временную метку того, что он недействителен? –
Показать минимальный код. Код стоит больше, чем описание, где мы должны представить, что вы сделали. –