红宝石轨道上。日期通过时更新属性

问题描述:

我觉得这是一个很小的问题,但在这里。红宝石轨道上。日期通过时更新属性

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

我希望当日期时间日期超过今天的日期时过期的布尔值设置为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 

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

+1

删除条件。属性现在更新了吗?如果是这样,问题是在条件。因此,您可能需要检查并查看记录的日期和Date.today是否正在返回,然后基于此创建新条件。 –

+0

令我惊讶的是,即使没有条件,属性也不会更新......我不知道为什么。 –

与知道布尔值的用途有关。如果您的目标是能够创建一个属性来用于整个代码中的查询(例如,获取所有过期的演出),那么范围可能是一个好方法。就在这个代码添加到您的千兆型号:

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)