活动记录:显示一系列对象中的第一个对象(优化)

时间:2016-09-29 19:43:05

标签: ruby-on-rails activerecord

我的应用向用户显示活动建议。出现的一个问题是,有时会在一系列事件中有多个具有不同日期的事件,例如:

  • 斯坦利剧院演出' Foo Bar'晚上1
  • 斯坦利剧院演出' Foo Bar'晚2
  • 斯坦利剧院演出' Foo Bar'晚上3

我想要做的是向用户仅显示一系列事件,其中包含最近的未来开始日期。

我可以编写一个方法来检查事件是否是系列中的第一个:

def first_in_series?
  ## return true unless self.siblings.count > 0 && 
    self.siblings.where(:date => Date.today..self.date).first.present?
end

def siblings
  ## some method to get events based on the similarity of their titles and attributes
end

然后在我的事件索引中,我可以编写如下内容:

<% future_events.all.each do |e| %>
  <% next unless event.first_in_series? %>
  <%= event.title %>
<% end %>

但是,当我渲染我的所有活动时,这似乎很费劲。如何使用Active Record Scopes优化此查询?

1 个答案:

答案 0 :(得分:2)

我认为范围可能会为您解决:

class Event
  has_one :first_sibling, lambda {
    joins(:siblings).where('siblings.date >= ?', Date.today).first
  }
end

然后,如果我没弄错的话,以下内容应该有效:

<%- future_events.joins(:first_sibling).each do |event| %>
  <%= event.title %>
<% end %>