我有许多需要相同范围的模型。他们每个人都有一个 expiration_date 日期字段,我想针对它编写一个范围。

为了保持干燥,我想将范围放在一个模块中(在/lib 中),我将用它来扩展每个模型。但是,当我在模块中调用 scope 时,该方法未定义。

为了解决这个问题,我在包含模块时使用 class_eval:

module ExpiresWithinScope
  def self.extended(base)
    scope_code = %q{scope :expires_within, lambda { |number_of_months_from_now| where("expiration_date BETWEEN ? AND ?", Date.today, Date.today + number_of_months_from_now) } }
    base.class_eval(scope_code)
  end
end

然后我在我的模型中执行 extend ExpiresWithinScope

这种方法有效,但感觉有点hackish。有没有更好的办法?

最佳答案

有了 AR3,他们终于接近 DataMapper 的厉害之处,所以你可以去

module ExpiresWithinScope
  def expires_within(months_from_now)
    where("expiration_date BETWEEN ? AND ?",
    Date.today,
    Date.today + number_of_months_from_now)
  end
end

你也可以试试:
module ExpiresWithinScope
  def expires_within(months_from_now)
    where(:expiration_date => Date.today..(Date.today + number_of_months_from_now))
  end
end

但是根据 the guide , arel 也无法处理。

关于ruby-on-rails - 在 Rails 3 中定义模块内范围的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3729454/

10-16 22:22