Rails 3:has_many通过查询

时间:2014-05-14 12:17:27

标签: ruby-on-rails-3 has-many-through

我有三个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

它不起作用。有什么想法吗?

1 个答案:

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