2016-05-23 11 views
0

Ich versuche, eine Abfrage zu finden, durch die ich die Datensätze aus der Datenbank ziehen können ... Unten finden Sie das BeispielRails Abfrage polymorphe Vereinigung im Zusammenhang

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 

Kann ich jede einzelne Abfrage schreiben, wo ich kann alle Ereignisse eines bestimmten Apfels und alle Ereignisse der mit diesem bestimmten Apfel verbundenen Bananen ziehen.

+0

so:

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

Wenn Sie die Sammlung wollen eine Active Beziehung zu sein, wird die folgende (Arel Union basiert) Ansatz könnte Hast du eine ID von Apple als Argument? –

Antwort

0

Sie müssen die Apfel Ereignisse kombinieren und die Bananen Apfel 'Ereignisse in eine Sammlung. Der einfache Ansatz, wenn ein Array genügt, ist zu nennen:

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

Danke Anand .... Ich schätze deine Hilfe sehr. Der obige Code funktioniert wie ein Charme ...... – Sheharose

0

Versuchen

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})") 

Erste where gibt Ihnen alle Ereignisse für den Apfel, zweite or gibt Ihnen alle Veranstaltungen für a ‚s Bananen

Verwandte Themen