活动记录将所有查询限制为日期范围

时间:2013-12-23 05:04:47

标签: ruby-on-rails activerecord

我希望能够将控制器上的所有查询限制为y > Date > x。我试图使用before_filter,但找不到一个好的解决方案。一种可能的解决方案是转到每个查询并添加一个额外的where过滤器,但我觉得有更好的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

default_scope

如果您希望对模型的所有请求具有相同的约束,请尝试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)}