Rails查询与多态关联有关

时间:2016-05-23 13:02:46

标签: ruby-on-rails ruby activerecord

我正在尝试查找一个查询,通过该查询我可以从数据库中提取记录......以下是示例

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 个答案:

答案 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