2010-03-05 11 views
7

C'è un modo per nidificare gli ambiti nominati l'uno dentro l'altro da modelli diversi?Ruby on Rails: ambiti nominati nidificati

Esempio:

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 

C'è un modo piacevole per me trovare una società, mentre compresi i dipendenti ei coniugi come questo:
Company.with_employees.with_spouse.find(1)
o è necessario che io definisco un altro named_scope nell'azienda:
:with_employees_and_spouse, :include => {:employees => :spouse}

in questo esempio forzato, non è troppo male, ma la nidificazione è molto più profondo nella mia richiesta, e mi piacerebbe che se non ho avuto ad un codice dd un-DRY che ridefinisce l'inclusione ad ogni livello del nesting.

+2

Da quello che so cercatori Rails3 http://m.onkey.org/2010/1/22/active-record-query-interface migliorato nella zona concatenamento del filtro . – clyfe

risposta

0

È necessario definire tutto il tempo tutte le condizioni. Ma è possibile definire un metodo per combinare alcune 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 
+0

Nel tuo metodo with_employees_with_spouse, sei incatenato insieme a_employees con il sottomodello with_spouse. Era quello inteso, dal momento che è quello che sto cercando un modo per fare. –

+0

sì, il mio esempio non è eccezionale ma non c'è un buon modo per farlo :( – shingara

1

È possibile utilizzare di default 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 

Allora questo dovrebbe funzionare. Non l'ho provato però.

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

Consiglierei di stare lontano da default_scope. È difficile fare un passo laterale quando è necessario e si intromette più spesso di quanto si pensi. –

+0

Definirei che utilizzare solo default_scope per l'ordine e non utilizzarlo mai per perfezionare o limitare i record restituiti da una query. –

0

provare questo

Company.with_employees.merge(Employees.with_spouse)