红宝石轨道上。日期通过时更新属性
问题描述:
我觉得这是一个很小的问题,但在这里。红宝石轨道上。日期通过时更新属性
我有一个模型(演出)与日期时间属性(日期)和过期的布尔属性(过期)。
我希望当日期时间日期超过今天的日期时过期的布尔值设置为true。
在千兆模式:
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
我觉得这应该是很简单的,但我不能找到这么多的信息。
答
与知道布尔值的用途有关。如果您的目标是能够创建一个属性来用于整个代码中的查询(例如,获取所有过期的演出),那么范围可能是一个好方法。就在这个代码添加到您的千兆型号:
scope :expired, -> { where('date < ?', Time.current.beginning_of_day) }
你可以通过写得到的所有过期的演出:
Gig.expired
那么你不需要过期的布尔可言。如果您使用当前的方法,则必须使用后台进程来每天设置过期的布尔值。有关使用范围的更多信息,请参见http://guides.rubyonrails.org/active_record_querying.html#scopes。
+0
对于我的项目,这可能是更好的方法,谢谢。我也会阅读指南。 –
答
创建一个rake任务,并在每天23:59(或任何你想要的时间)运行。
Gig.where('date < ?', Date.today).update_all(expired: true)
删除条件。属性现在更新了吗?如果是这样,问题是在条件。因此,您可能需要检查并查看记录的日期和Date.today是否正在返回,然后基于此创建新条件。 –
令我惊讶的是,即使没有条件,属性也不会更新......我不知道为什么。 –