Ruby on Rails: вложенные именованные области - PullRequest
7 голосов
/ 05 марта 2010

Есть ли способ вложить именованные области внутри друг друга от разных моделей?

Пример:

class Company
  has_many :employees
  named_scope :with_employees, :include => :employees
end
class Employee
  belongs_to :company
  belongs_to :spouse
  named_scope :with_spouse, :include => :spouse
end
class Spouse
  has_one :employee
end

Есть ли какой-нибудь хороший способ найти компанию, включая сотрудников?и такие супруги:
Company.with_employees.with_spouse.find(1)
или мне необходимо определить другой named_scope в компании:
:with_employees_and_spouse, :include => {:employees => :spouse}

В этом надуманном примере это не так уж плохо, ноВложенность в моем приложении намного глубже, и мне бы хотелось, чтобы мне не пришлось добавлять код un-DRY, переопределяющий включение на каждом уровне вложения.

Ответы [ 3 ]

1 голос
/ 11 марта 2010

Вы можете использовать область видимости по умолчанию

class Company
  default_scope :include => :employees
  has_many :employees
end

class Employee
  default_scope :include => :spouse
  belongs_to :company
  belongs_to :spouse
end

class Spouse
  has_one :employee
end

Тогда это должно работать. Я не проверял это все же.

Company.find(1)          # includes => [:employee => :spouse]
0 голосов
/ 23 апреля 2014

попробуйте

Company.with_employees.merge( Employees.with_spouse)
0 голосов
/ 06 марта 2010

Вам необходимо все время определять все ваши условия. Но вы можете определить какой-то метод, чтобы объединить несколько named_scope


class Company
  has_many :employees
  named_scope :with_employees, :include => :employees
  named_scope :limit, :lambda{|l| :limit => l }

  def with_employees_with_spouse
    with_employees.with_spouse
  end

  def with_employees_with_spouse_and_limit_by(limit)
    with_employees_with_spouse.limit(limit)
  end

end
class Employee
  belongs_to :company
  belongs_to :spouse
  named_scope :with_spouse, :include => :spouse
end
class Spouse
  has_one :employee
end
...