0

我有一个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属性self.weeks_left == "completed",但我对使用 after_find 有点不确定——一般来说,查询似乎太多了,而且确实太痛苦了(尤其是在阅读本文之后) - 但在这种情况下,一旦一个主题完成,它就不会改变,所以多次检查它的状态似乎没有用 - 处理这个问题的最佳方法是什么?

4

2 回答 2

1

你为什么不为此做一个范围?

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

和一个方法

def completed?
  self.weeks_left == "completed"
end
于 2013-09-18T18:31:39.850 回答
0

看起来你需要 ActiveRecord::Callbacks。您可以在此处或在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
于 2013-09-18T18:33:51.730 回答