【问题标题】:Rails 3: How to merge queries or scopes for complex query?Rails 3:如何合并复杂查询的查询或范围?
【发布时间】:2010-12-24 01:30:51
【问题描述】:

我正在构建一个非常简单的事件应用程序,它具有 titlestart_dateend_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


【解决方案1】:

尝试使用范围:

class Event < AR::Base
  scope :active, lambda { |date| where("start_date < ? AND end_date > ?", date) }
  scope :future, lambda { |date| where("end_date < ?", date }
  ...
end

# Console
> @active_events = Event.active(Date.today)
> @future_events = Event.future(Date.today)

http://guides.rubyonrails.org/active_record_querying.html

【讨论】:

  • 我根据您的建议在我的问题中添加了更多代码,但仍然无法合并查询或范围。如果我链接它们 active.in_progess.single,我会得到 2 个结果,而不是合并的结果(更多结果)
  • 由于您的建议,做了一些改进并解决了问题,但仍然不确定代码是否可靠。你能评论一下吗?
猜你喜欢
  • 2014-01-04
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多