渴望加载嵌套关联和范围

时间:2011-05-29 19:11:58

标签: ruby-on-rails

我是初学者,很难解释我的问题:

我的模特:

class Skill  
  has_many :categories
  has_many :positions, :through => :categories
end

class Category
  belongs_to :skill
  has_many :positions  
end

class Position
  belongs_to :category
  has_one :skill, :through => :category    
end

我可以成功地加载所有内容,例如:

@skills = Skill.includes(:positions)

但有时我想在职位上应用范围:

class Position
...
  scope :active, where(:hidden => false)
end

我希望我能做到:

@skills = Skill.includes(:positions.active)

相反,我在视图中应用范围,但是急切加载不再起作用了:

<%= skill.positions.acitve ... %>

是否可以同时拥有预先加载和范围?

2 个答案:

答案 0 :(得分:7)

您可以使用其他关联:

class Skill  
  has_many :categories
  has_many :positions, :through => :categories
  has_many :active_positions, :through => :categories
end

class Category
  belongs_to :skill
  has_many :positions  
  has_many :active_positions, :class_name => "Position", :conditions => {:hidden => false}
end

class Position
  belongs_to :category
  has_one :skill, :through => :category    
end

然后

@skills = Skill.includes(:active_positions)

但是你会得到两个联想。如果您使用skill.positions,则将从数据库加载所有技能的位置。您应该只使用skill.active_positions

答案 1 :(得分:0)

试试这个:

@skills = Skill.includes(:positions).where('position.active = TRUE')