我有一个包含三个字段的模型active
,start_suscription
,end_suscription
,active is boolean
和i f这是因为订阅尚未完成< / strong>,我的问题是如何在订阅结束时让rails自动将其更改为false`,在django中它很容易但我只是从rails开始并且我不知道。
答案 0 :(得分:2)
我建议您不要使用其他列来缓存&#34;一个易于计算的信息:
如果删除列active
,则可以通过定义实例方法active?
来确定单个记录是否处于活动状态:
# in your model
def active?(as_of_date = Date.current)
(start_suscription..end_suscription).include?(as_of_date)
end
# usage
instance = YourModel.new(start_suscription: Date.yesterday, end_suscription: Date.tomorrow)
instance.active? # => true
instance.active?(Date.current + 1.week) # => false
要获取所有有效记录,请创建范围:
scope :active, -> (as_of_date = Date.current) { where('? BETWEEN start_suscription AND end_suscription', as_of_date) }
# usage
YourModel.active
YourModel.active(Date.yesterday)
如果你想坚持你的缓存专栏(我强烈反对),你需要一个工人(每X次触发一次)来抓取所有现在不活动的记录并更新他们的{{1} }专栏。
答案 1 :(得分:0)
如果“活动”是数据库字段,则可以在订阅模型中创建回调,例如
before_save :set_active
def set_active
self.active = self.start_subscription >= Date.today and self.end_suscription <= Date.today
end
像yoshii先生所说,活跃不应该是数据库领域。如果是,并且您不想更改它,您应该在每个请求或日常任务中触摸记录。