8

有没有办法将不同模型的命名范围相互嵌套?

例子:

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)
或者我是否有必要在 Company 中定义另一个 named_scope:
:with_employees_and_spouse, :include => {:employees => :spouse}

在这个人为的例子中,它并不算太糟糕,但是我的应用程序中的嵌套要深得多,如果我不必添加 un-DRY 代码来重新定义嵌套的每个级别的包含,我会喜欢它。

4

3 回答 3

1

您可以使用默认范围

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]
于 2010-03-11T19:54:45.923 回答
0

您需要始终定义所有条件。但是你可以定义一些方法来组合一些 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
于 2010-03-05T22:19:52.153 回答
0

尝试这个

Company.with_employees.merge( Employees.with_spouse)
于 2014-04-23T12:51:57.507 回答