2010-03-05 9 views
7

Gibt es eine Möglichkeit, benannte Bereiche innerhalb verschiedener Modelle zu verschachteln?Ruby on Rails: Verschachtelte benannte Bereiche

Beispiel:

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 

Gibt es eine schöne Möglichkeit für mich, ein Unternehmen zu finden, während einschließlich der Mitarbeiter und Ehepartner wie folgt aus:
Company.with_employees.with_spouse.find(1)
oder ist es nötig, dass ich eine andere named_scope in Gesellschaft zu definieren:
:with_employees_and_spouse, :include => {:employees => :spouse}

in diesem konstruiertes Beispiel, dann ist es nicht so schlecht, aber die Verschachtelung ist viel tiefer in meiner Anwendung, und ich würde es gerne, wenn ich nicht eine habe dd un-DRY-Code definiert das Include auf jeder Ebene der Verschachtelung neu.

+2

Von dem, was ich weiß, rails3 Findern http://m.onkey.org/2010/1/22/active-record-query-interface im Filter Verkettungsbereich verbessert . – clyfe

Antwort

0

Sie müssen die ganze Zeit alle Ihre Bedingungen definieren. Aber Sie können eine Methode definieren einige named_scope zu kombinieren


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

In Ihrer with_employees_with_spouse-Methode wurden Sie mit Mitarbeitern mit dem Sub_models with_spouse verkettet. War das beabsichtigt, da ich nach einer Möglichkeit suche. –

+0

ja mein Beispiel ist nicht wirklich toll, aber es gibt keine wirklich gute Möglichkeit zu tun :( – shingara

1

Sie können mit Standard-Scoping

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 

Dann sollte diese Arbeit. Ich habe es aber nicht getestet.

Company.find(1)   # includes => [:employee => :spouse] 
+0

Ich würde empfehlen, weg von default_scope. Es ist schwierig zu Seite Schritt, wenn Sie müssen und es kommt öfter in die Quere, als Sie denken. –

+0

Ich würde das dahingehend verfeinern, dass ich default_scope nur zum Bestellen verwende und es nie dazu verwende, die von einer Abfrage zurückgegebenen Datensätze zu verfeinern oder einzuschränken. –

0

versuchen diese

Company.with_employees.merge(Employees.with_spouse)