我有一个模型,上面有方法调用due?
。
def due?
case self[:occurring]
when 'yearly'
last_update = self[:date]
due = self[:action]
today = Date.today
this_year = today.year
next_year = this_year + 1
return (
last_update >= (Date.new(this_year, due.month, due.day)) &&
last_update < Date.new(next_year, due.month, due.day) &&
!self.open?
)
when 'monthly'
#... TODO
else
return self[:date] <= DateTime.now
end
end
这没什么太糟糕的。问题是我需要使用上面的算法/搜索找到所有到期的记录。我打算使用示波器,但我觉得它有点太多了。我该怎么办?
答案 0 :(得分:3)
最简单的方法是LeModel.all.select(&:due?)
,但请记住,这将从数据库中获取所有记录并在Rails过程中进行过滤,这可能很慢(获取记录,而不是进行过滤) )。如果您有太多记录,则需要在SQL中实现due?
,这样您就可以直接对数据库进行检查。
答案 1 :(得分:0)
Idan提出的另一个选项可能是在模型的创建时间内计算此字段,并将其保存到due
列中的数据库中。
要做到这一点:
self.due = due?
执行此操作后,您只需向数据库查询到期值:Model.where(due: true)
请注意,如果选择以这种方式工作,则还必须创建迁移以在DB中为已存在的所有模型实例生成到期值