ruby-on-rails - 急切加载嵌套关联和范围

标签 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)

相反,我在 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/

相关文章:

ruby-on-rails - squeel 中的嵌套查询

ruby-on-rails - 是否有在Rails中使用哈希值的find_or_create_by_?

ruby-on-rails - Rails 使用 metasearch 和 metawhere 搜索计算字段

ruby-on-rails - 未定义方法 `[]' 为 true :TrueClass

MySQL(ActiveRecord)计算日期列在分组的月份和年份之前或之前的行

ruby-on-rails - 如何为 postgres jsonb 字段添加事件管理字段

ruby-on-rails - (config.filter_parameters) 相当于 Rails 2.3.5

ruby-on-rails - 防止用户中的 updated_at 字段在使用设备登录时被修改

ruby-on-rails - 如何使用外键删除 Active Record 对象而不使用级联删除?

javascript - 我的semantic-ui js 不能与rails 一起使用