Нежелательная загрузка вложенных связей и областей

Я новичок, и мне трудно объяснить мою проблему:

Мои модели:

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 ... %>

Возможно ли иметь как загружаемую загрузку, так и область видимости?

Ответ 1

Вы можете использовать другую ассоциацию:

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.

Ответ 2

Попробуйте следующее:

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