更新仅更改一次的模型属性

时间:2013-09-18 18:16:04

标签: ruby-on-rails ruby-on-rails-3 callback

我的subject模型的属性包括start_dateend_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之后) - 但在这种情况下,一旦主题完成,它就不会改变,所以检查它的状态似乎没用不止一次 - 处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

为什么不为此制作范围?

scope :completed, ->{where("end_date <= ?", Time.now)}

和方法

def completed?
  self.weeks_left == "completed"
end

答案 1 :(得分:0)

看起来你需要ActiveRecord :: Callbacks。您可以在hererails 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