2016-05-23 150 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

所以你有蘋果的'id'作爲參數嗎? –

回答

0

您需要蘋果事件結合起來,蘋果的香蕉中的所有事件'事件合併爲一個集合。簡單的方法,如果數組足夠,就是打電話:

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

如果你想收集是一個ActiveRecord的關係,你可以採取以下(AREL聯盟爲基礎)的方法:

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

謝謝阿南德....我真的很感謝你的幫助。上面的代碼像一個魅力...... – 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的香蕉