在模型上找到method = true的位置?

时间:2013-10-15 10:08:08

标签: ruby-on-rails

我有一个模型,上面有方法调用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

这没什么太糟糕的。问题是我需要使用上面的算法/搜索找到所有到期的记录。我打算使用示波器,但我觉得它有点太多了。我该怎么办?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

  1. 添加迁移以向DB添加到期字段
  2. 在将self.due = due?
  3. 的模型上添加before_save挂钩

    执行此操作后,您只需向数据库查询到期值:Model.where(due: true)

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