Запрос 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

Могу ли я написать любой один запрос, где я могу вытащить все события конкретного яблока и все события бананов, связанные с этим конкретным яблоком.

2 ответа

  1. Пытаться

    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бананов

  2. Вам нужно объединить события apple и события Apple banans в одну коллекцию. Простой подход, если массива достаточно, заключается в вызове:

    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