Ruby on rails。日期过后更新属性

时间:2016-02-03 20:29:47

标签: ruby-on-rails datetime update-attribute

我觉得这是一个非常noob的问题,但是这里有。

我有一个带有日期时间属性(日期)的模型(演出)和一个过期的布尔属性(已过期)。

当日期时间日期超过今天的日期时,我希望过期的布尔值设置为true。

在Gig模型中:

def expired
  if self.date.to_date > Date.today
    self.update(:expired, true)
  end
end

不起作用。 也没有:

def expired
  if self('date < ?', Date.today)
    self.update_attribute(:expired, true)
  end
end

我觉得这应该很简单,但我找不到很多信息。

2 个答案:

答案 0 :(得分:2)

创建一个rake任务,并在每天23:59(或任何你想要的时间)运行。

Gig.where('date < ?', Date.today).update_all(expired: true)

答案 1 :(得分:1)

了解布尔值的目的是相关的。如果您的目标是能够创建一个属性以用于整个代码中的查询(例如,获取所有过期的演出),那么范围可能是一个好方法。只需将此代码添加到您的Gig模型中:

scope :expired, -> { where('date < ?', Time.current.beginning_of_day) }

然后你可以通过写下来获得所有过期的演出:

Gig.expired

然后你根本不需要过期的布尔值。如果您使用当前的方法方法,则必须使用后台进程每天设置过期的布尔值。有关使用范围的详细信息,请参阅http://guides.rubyonrails.org/active_record_querying.html#scopes