我有许多需要相同范围的模型。他们每个人都有一个 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/