Ruby on Rails: Вложенные названные объемы

Там какой-либо путь состоит в том, чтобы вложить названные объемы друг в друге из различных моделей?

Пример:

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}

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

8
задан William Jones 5 March 2010 в 19:58
поделиться

2 ответа

Вам нужно постоянно определять все ваши условия. Но вы можете определить метод для объединения некоторых 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
0
ответ дан 6 December 2019 в 02:24
поделиться

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

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]
1
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: