我是初学者,很难解释我的问题:
我的模型:
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)
相反,我在 View 中应用了范围,但急切加载不再起作用:
<%= skill.positions.acitve ... %>
是否可以同时具有预先加载和作用域?
最佳答案
您可以使用另一个关联:
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
.
关于ruby-on-rails - 急切加载嵌套关联和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6169828/