2011-09-09 4 views
3

を働いていない。Railsの3つのポリモーフィック協会:協会を参照belongs_toの側のスコープは、私は以下のポリモーフィック関連を持っている

class Invite < ActiveRecord::Base 
    belongs_to :inviteable, :polymorphic => true 

class Event < ActiveRecord::Base 
    has_many :invites, :as => :inviteable, :dependent => :destroy 

class Team < ActiveRecord::Base 
    has_many :invites, :as => :inviteable, :dependent => :destroy 

私はイベントに固有の招待にスコープを作成しようとしている、そして未来へのよイベント:

(in Invite.rb) 
    scope :to_events, where('inviteable_type = ?', "Event") 
    scope :to_future_events, lambda { self.to_events.joins("join events").where('events.starttime > ?', Time.now) } 

to_eventsスコープは正常に動作します。 to_future_eventsは、招待の正しいサブセットを返しますが、それぞれの多数のコピーを返します。どんな考え?私が達成しようとしていることを達成するためのクリーナー/ Rails-ierの方法はありますか?

+1

「Rails Way」を探している場合は、「Invite」を「Invitation」に変更して、モデルが動詞ではなく名詞であることを明確にする必要があります。あなたのコードが少し良くなるようにします。 –

答えて

4

あなたが参加するためにONステートメントを提供する必要があります。

scope :to_future_events, lambda { self.to_events.joins("join events on events.id = invites.inviteable_id").where('events.starttime > ?', Time.now) } 

それ以外の場合は、すべてのイベントレコードを持つすべての招待のレコードを結合します。

+0

それは理にかなっていますが、私はinviteable_type == "Event"チェックのいくつかの並べ替えも必要でしょうか? inviteable_type == "team"があり、inviteable_idがevent.idに相当する場合があり、そのイベントは将来行われることがあります。その場合、私はまだ偽装の結果を得るだろうか? –

+0

さて、あなたは 'to_events'スコープから連鎖させているので、' where( 'inviteable_type =?'、 "Event")の条件をすでに持っています。 –

+0

もちろん。ありがとう。 –