Вызов метода модели в определенное время (Ruby on Rails) - PullRequest
5 голосов
/ 30 марта 2012

У меня есть модель Ruby on Rails, в которой есть столбец с именем expiration_date. По истечении срока годности я хочу изменить другой столбец модели (например, expired = true). Каковы хорошие способы сделать это?

В идеале я хотел бы, чтобы функция модели вызывалась в точный момент истечения срока действия.

Ответы [ 3 ]

6 голосов
/ 30 марта 2012

Используйте delayed_job драгоценный камень. После установки gem delayed_job сделайте следующее:

class Model < ActiveRecord::Base

  after_create :set_expiry_timer

  # register the timer
  def set_expiry_timer
    delay(:run_at => expiration_date).expire
  end

  def expire
    update_attribute(:expired, true) unless expired?
  end

end
2 голосов
/ 30 марта 2012

Для сценария, который вы описываете, лучшее решение - использовать метод expired вместо столбца, который вернул бы true, если expiration_date больше или равно текущей дате.

ДляВ других случаях я бы использовал запланированное событие БД, запускающее хранимую процедуру.Эта процедура будет проверять столбец expiration_date для всех строк в таблице моделей и соответствующим образом обновлять столбец (столбцы) expired (или другие).

0 голосов
/ 30 марта 2012

Рассматривали ли вы использовать планировщик для автоматизации этого?Что-то вроде Resque , Delayed Job или Cron будет работать нормально.

Тогда в запланированном задании вы можете получить что-то вроде этого:

if foo.expiration_date < Time.now
  foo.is_expired = true
  foo.save
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...