2010-12-30 10 views
0

かなり複雑なことを説明しようとしています。おそらくもっと複雑であると言えるでしょう。私には「出来事」があります。これらのイベントは「会場」に属します。したがって会場have_manyイベント会場モデルでのイベント。Rails 3:has_manyから返されたアソシエートされたレコードのフィルタ

イベントは複雑で、イベントが過去、現在、または将来であるかどうかを判断するスコープがあります。正しいイベント(将来または現在のみ)を取得するスコープは次のとおりです。

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 > ? OR start_date = ? OR end_date = ?", Date.today, Date.today, Date.today, Date.today, Date.today, Date.today) } 

scope :valid, (not_over_or_in_progress.active).order("start_date ASC") 

あまりにもきれいですが正常に動作します。今、私は会場を表示するとき、私は関連付けられたイベントを取得することができます

<% @venue.events.each do |event| %> 
    <li><%= event.title %> - (<%= event.event_status? %>)</li> 
<% end %> 

私は、彼らは、過去現在または将来であるかどうか、すべてのイベントを取得します。 @ events.validは返さず、@ events.all(すべて)を返します。 私のヘルパー(event_status?)のスコープ(有効)でフィルタリングされた関連するイベントを取得したいと思います。それは可能ですか?

私はイベントが終了したかどうかを判断するためにいくつかのヘルパーを取得しました。それはevent_statusですか? 〜のためです。

<% @venue.events.each do |event| %> 
    <li><%= event.title %> - (<%= event.event_status? %>)</li> 
<% end %> 

へ:

<% @venue.events.valid.each do |event| %> 
    <li><%= event.title %> - (<%= event.event_status? %>)</li> 
<% end %> 

また、あなたはmeta-where宝石を使用する場合は、あなたからあなたのスコープを変更することができることを知りたいかもしれない多分それは変更する

答えて

1

あなたの必要性を支援します。

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 > ? OR start_date = ? OR end_date = ?", Date.today, Date.today, Date.today, Date.today, Date.today, Date.today) } 

へ:

scope :not_over, lambda { where(:start_date <= Date.today, :end_data >= Date.today) | where(:start_date = Date.today, :end_date => nil)} 

初期化子

MetaWhere.operator_overload! 

(よりクリーンな?)

+0

スーパー素晴らしい答えでこれを入れて! +100ありがとうございました。私はこれまでレールとコミュニティを愛しています。私はその宝石を試してみよう、私のスコープが醜いから!また、@ venue.events.validを会場のコントローラーやモデルの一部として、よりMVCになると考えるべきでしょうか? – Landitus

+0

@ryanは実際にメタを使用しています。あなたはそのようなことをすることができます。 – thomasfedb