2016-05-23 5 views
0

に関連するクエリ私は以下...私は、データベースからレコードを引っ張ることができ、それを通してクエリを見つけようとしているが、Railsのポリモーフィックな関連

class Apple < AR::Base 
    has_many :bananas 
    has_many :events, as: :eventable 
end 

class Banana < AR::Base 
    belongs_to :apple 
    has_many :events, as: :eventable 
end 

class Event < AR::Base 
    belongs_to :eventable, polymorphic: true 
end 

例ですが、私は、任意の単一のクエリを書くことができます特定のリンゴのすべてのイベントとその特定のリンゴに関連するバナナのすべてのイベントを引き出すことができます。

+0

:あなたはActiveRecordの関係になるように、コレクションをしたい場合は、次の(AREL組合ベース)のアプローチを取ることができる

def events_for apple apple.events + apple.bananas.map(&:events).flatten end 

:配列が充分であれば、単純なアプローチは、呼び出すことです議論としてリンゴの「id」を持っていますか? –

答えて

0

のすべてのイベントを提供します'イベントを1つのコレクションにまとめます。そう

def events_for apple 
    apple_events = apple.events 
    banana_ids = apple.bananas.pluck(:id) 

    banana_events = Event.where(eventable_type: 'Banana', eventable_id: banana_ids) 

    all_events = Event.from(" 
     (
      (
       #{apple_events.to_sql} 
      ) union (
       #{banana_events.to_sql} 
      ) 
     ) #{Event.table_name} 
    ").distinct 
    end 
end 
+0

ありがとうAnand ....本当にありがとうございます。上記のコードは魅力的なものでした...... – Sheharose

0

a = Apple.first 

Event.where("eventable_type = 'Apple' AND eventable_id = ?", a.id).or("eventable_type = 'Banana' AND eventable_id IN (#{a.banana_ids.to_sql})") 

まずwhereを試してみてはあなたにリンゴのすべてのイベントを与え、二orはあなたがリンゴのイベントやリンゴのバナナを結合する必要がaのバナナ

関連する問題