【发布时间】:2010-12-24 01:30:51
【问题描述】:
我正在构建一个非常简单的事件应用程序,它具有 title 和 start_date 和 end_date。我想通过混合一些值来过滤我的查询,例如:如果 start_date 已经过去但 end_date 没有,则事件处于活动状态并且应该显示。如果两个日期都过去了,也应该省略。我认为范围是答案,但我只能使用下面显示的一些方法过滤视图中的记录。
我真的很想过滤传递给控制器 (@events) 的查询。 我想显示所有活动的、未来的 start_date 或过去的 start_date 但仍在进行中的事件(今天的日期在 start_date 和 end_date 之间)
已编辑
我已经创建了一些范围来返回查询的每个部分。链接它们实际上是减去结果而不是合并它们。所以我已经使用了这段代码并且确实有效我不知道这是多么坚固或干燥。对我来说看起来有点难看...这是在 Rails 3 中合并查询的好方法吗?
scope :active, where("active = ?", true)
scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ?", Date.today, Date.today, Date.today, Date.today) }
scope :valid, not_over_or_in_progress.active.order("start_date DESC")
【问题讨论】:
-
现在你有了范围,如果你想合并结果然后做一个联合:Event.active | Event.in_progress(日期.今天)。请注意,这将生成一个常规的旧数组,而不是 ActiveRecord::Relation 对象。 IE。您将无法链接更多查询。
标签: ruby-on-rails ruby-on-rails-3 named-scope