我正在尝试查找一个查询,通过该查询我可以从数据库中提取记录......以下是示例
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 :(得分: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
香蕉的所有活动
答案 1 :(得分:0)
您需要将苹果事件和苹果香蕉的活动合并为一个系列。如果数组足够,那么简单的方法就是调用:
def events_for apple
apple.events + apple.bananas.map(&:events).flatten
end
如果您希望该集合是ActiveRecord Relation,您可以采用以下(基于arel union)方法:
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