Ruby on Rails:嵌套的命名范围

时间:2010-03-05 19:58:56

标签: ruby-on-rails activerecord include nested named-scope

有没有办法在不同模型中将命名范围嵌套在彼此内?

示例:

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代码重新定义嵌套的每个级别的包含,我会喜欢它

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分:0)

试试这个

Company.with_employees.merge( Employees.with_spouse)