我的subject
模型的属性包括start_date
和end_date
- 以及completed
布尔属性。
在subject.rb
中,我有一种方法可以查找给定subject
剩余的周数:
def weeks_left
time = (self.end_date.to_time - Date.today.to_time).round/1.week
if time < 0
"completed"
elsif time < 1
"less than 1 week"
elsif time == 1
"1 week"
else
"#{time} weeks"
end
end
我想勾选completed
属性if self.weeks_left == "completed"
并且最好的方法就像回调一样,但我对使用after_find有点不确定 - 一般来说它似乎是会有太多的疑问,而且确实有太大的痛苦(特别是在阅读this之后) - 但在这种情况下,一旦主题完成,它就不会改变,所以检查它的状态似乎没用不止一次 - 处理这个问题的最佳方法是什么?
答案 0 :(得分:1)
为什么不为此制作范围?
scope :completed, ->{where("end_date <= ?", Time.now)}
和方法
def completed?
self.weeks_left == "completed"
end
答案 1 :(得分:0)
看起来你需要ActiveRecord :: Callbacks。您可以在here或rails guide
上查看更多信息before_save :update_completed
def update_completed
if (end_date_changed?)
time = (self.end_date.to_time - Date.today.to_time).round/1.week
self.complete = time < 0
end
end
这样,只要end_date发生更改,就会更新完整标志,并且它始终保持同步。
然而,因为这是一个计算值,您也不能将其存储为属性,只需定义一个方法来获取它
def complete
time = (self.end_date.to_time - Date.today.to_time).round/1.week
return time < 0
end