我正在尝试找到一个查询,通过该查询可以从数据库中提取记录...下面是示例
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
香蕉的所有事件