2016-09-29 17 views
0

アプリはユーザーにイベントの提案を表示します。アクティブレコード:一連のオブジェクトの最初のオブジェクトを表示します(最適化)

  • スタンリー・シアターは1
  • スタンレー劇場プレゼンツ「フーバー」ナイトプレゼンツ「フーバー」ナイト:来ている1つの問題は、時には異なる日付で複数のイベントが、例えば、直列で、あるということです2
  • スタンレーシアターが「フーバー」ナイトプレゼンツ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 %> 

をしかし、これはそうですすべてのイベントをレンダリングしているときには税金がかかるようです。アクティブレコードスコープを使用してこのクエリを最適化するにはどうすればよいですか?

+0

私はここに –

+0

で何の問題を把握することはできませんあなたがいつも 'first_in_series'(btw、メソッドは'? 'を持つべきではありません)を持っているときの' next'は、それが返されるブール値ではないからです。 –

+0

@AndreyDeinekoはいくつかの編集を行いました。 'first_in_series'には常に1つあるとは限りません。いつself.siblings.where(:date => Date.today..self.date).first.present?偽を返します...それはイベントがそれ自身の日付の前に日付を持つ兄弟を持っていることを意味します –

答えて

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 %> 
+0

ちょっと@AndreyDeineko - 答えてくれてありがとう。問題は、私には「兄弟」モデルがないことです。私はイベントが兄弟であるかどうかを特定することができます。 –

+0

申し訳ありません - 「兄弟」の私の表現は混乱していました –

+0

@JacksonCunninghamは兄弟方法を表示します:) –

関連する問題