我有三个Active Record模型:
class Event < ActiveRecord::Base
has_many :event_categories, inverse_of: :event
has_many :categories, through: :event_categories
end
class EventCategory < ActiveRecord::Base
belongs_to :event
belongs_to :category
end
class Category < ActiveRecord::Base
has_many :event_categories
has_many :events, through: :event_categories
end
我认为关系很好。
如果我想知道什么事件有类别,例如id = 5 ..我这样做:
Category.find(5).events
但是,如果我想知道多个类别的所有事件,例如:
Category.where(:id => [3,5]).events
它不起作用。有什么想法吗?
答案 0 :(得分:0)
请注意,当您在模型中执行has_many :events
时,Active Record会为该类定义名称events
的方法。
执行Category.find(5).events
时,您会events
与一个对象相关联(即Category.find(5)
),但是Category.where(:id => [3,5])
会返回Category
个对象的数组,所以你不能在数组上使用events
函数,只有获得所有搜索结果events
的方法才会迭代它们并单独访问它们,如下所示:
all_events = Category.where(:id => [3,5]).inject([]) {|res,cat| res << cat.events}
上面的代码每次迭代都会执行一次查询,为避免这种情况,我们可以在第一个查询本身中包含events
,如下所示,这将只提供一个查询结果:
all_events = Category.includes(:events).where(:id => [3,5]).inject([]) {|res,cat| res << cat.events}