目前,在我的控制器中,我将值赋给变量,如下所示:
@tasks = @list.tasks.where(:importance => 'high', :active => true).search(params[:search])
我想知道的是,是否存在使用.where或任何其他方式使用模型方法进行选择的方法。我有一个模型方法,它返回一个表示相对截止日期的字符串:
def due
if self.due_date < Date.today + 2.days
return 'now'
elsif self.due_date < Date.today + 1.week
return 'soon'
else
return 'later'
end
end
我不想将这个.due值存储在数据库中,因为它会根据日期不断变化。但是理论上我想要做的就是在我的控制器中进行选择:
@tasks = @list.tasks.where(:importance => 'high', :active => true, :due => 'now).search(params[:search])
但是这不起作用,因为.due不在数据库中。我应该用范围做这个吗?无论如何,感谢帮助。
答案 0 :(得分:2)
你可以做范围:
scope :due_now, lambda { where("due_date < ?", Date.today + 2.days) }
scope :due_soon, lambda { where("due_date < ?", Date.today + 1.week) }
scope :due_later, lambda { where("due_date >= ?", Date.today + 1.week) }
或者,你可以像这样使用你的类方法:
@tasks = @list.tasks.where(:importance => 'high', :active => true).select{ |task| task.due == 'now' }.search(params[:search])