我希望能够将控制器上的所有查询限制为y > Date > x
。我试图使用before_filter,但找不到一个好的解决方案。一种可能的解决方案是转到每个查询并添加一个额外的where
过滤器,但我觉得有更好的方法。
有什么想法吗?
答案 0 :(得分:4)
如果您希望对模型的所有请求具有相同的约束,请尝试default_scope
# models/activity.rb
class Activity < ActiveRecord::Base
default_scope { where("date between ? and ?", 5.days.ago, Date.current) }
end
所以如果你打电话:
Activity.all
您将只返回default_scope指定的日期范围内的活动。
如果您希望能够为不同的查询指定日期范围,则可以创建一个必须显式调用的范围:
# models/activity.rb
class Activity < ActiveRecord::Base
scope :between_dates, ->(begin_date,end_date) {
where("date between ? and ?", begin_date, end_date)
}
end
您可以在控制器中调用,如:
Activity.between_dates(5.days.ago, Date.current)
答案 1 :(得分:0)
jstim的答案可能是您的问题的正确答案,限制应该在MODEL而不是控制器中完成。模型使用数据,控制器处理模型,视图和请求之间的交互。
另见http://guides.rubyonrails.org/active_record_querying.html#scopes
但是,如果它必须在控制器中完成,那么只需将过滤器应用于实例变量即可。例如@ post.default_scope {where(“date between?and?”,5.days.ago,Date.current)}