0

我有一个带有方法调用的模型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

这没什么太糟糕的。问题是我需要使用上述算法/搜索找到所有到期的记录。我打算使用范围,但我认为它有点太多了。我该如何进行?

4

2 回答 2

3

最简单的方法是LeModel.all.select(&:due?),但请记住,这将从数据库中获取所有记录并在 Rails 进程中进行过滤,这可能很慢(获取记录,而不是进行过滤)。如果你有太多的记录,你会想due?用 SQL 来实现,这样你就可以直接对数据库进行检查。

于 2013-10-15T10:16:13.927 回答
0

Idan 提出的另一种选择可能是在模型的创建时间计算此字段并将其保存到due列中的数据库中。去做这个:

  1. 添加迁移以将到期字段添加到数据库
  2. 在模型上添加一个 before_save 钩子self.due = due?

之后,您可以简单地查询数据库以获得应有的值:Model.where(due: true)

请注意,如果您选择以这种方式工作,您还必须创建迁移以在数据库中为所有已存在的模型实例生成应有的值

于 2013-10-15T10:35:32.070 回答