Ruby on rails RubyonRails:嵌套命名作用域

Ruby on rails RubyonRails:嵌套命名作用域,ruby-on-rails,activerecord,include,nested,named-scope,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

有没有办法将不同模型中的命名作用域相互嵌套

例如:

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
有没有什么好方法可以让我找到一家公司,同时也包括员工和配偶:
公司。有员工。有配偶。查找(1)

或者我有必要在公司中定义另一个命名的范围:
:与员工和配偶一起,:include=>{:employees=>:party}


在这个人为设计的示例中,这并不算太糟糕,但嵌套在我的应用程序中要深入得多,如果我不必添加非干性代码来重新定义嵌套的每个级别上的包含,我希望这样做。

您需要随时定义所有条件。但是您可以定义一些方法来组合一些命名的\u范围


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

您可以使用默认范围

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]
试试这个

Company.with_employees.merge( Employees.with_spouse)

据我所知,rails3 finders在过滤器链接方面有所改进。在您的with_employees_with_Amployee方法中,您使用子模型的with_Amployee与_employees链接在一起。这是有意的,因为这是我正在寻找的方法。是的,我的例子不是很好,但没有真正好的方法:(我建议不要使用默认范围。在需要时很难回避,而且它比您想象的更频繁。我会将其细化为仅使用默认范围进行排序,而从不使用它来细化或限制查询返回的记录。)。