有没有办法在不同模型中将命名范围嵌套在彼此内?
示例:
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代码重新定义嵌套的每个级别的包含,我会喜欢它
答案 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)