与多态关联相关的 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

我可以编写任何单个查询,在其中我可以提取特定苹果的所有事件以及与该特定苹果相关的香蕉的所有事件。

您需要将苹果事件和苹果香蕉事件合并到一个集合中。如果数组足够,简单的方法是调用:

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

如果希望集合成为活动记录关系,则可以采用以下(基于 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

尝试

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香蕉的所有事件