2016-07-25 6 views
0

Das Problem2 Ebene tiefere Beziehung in Active

I mit einer 2-Ebene tiefen Beziehung von Active Klassen in Schienen arbeiten. Ich habe drei Klassen foo, bar und bla. foo hat viele bar ‚s, und bar hat ein bla

Alle meine Beziehungen arbeiten individuell in Ordnung, das heißt, so etwas wie Foo.find(1).bars.find(1).blas funktioniert gut. Das Problem ist, dass ich bei einer foo den ActiveRecord Satz von allen bla bezogen auf foo 's bars bekommen würde.

Dinge, die ich versucht habe

bar und bla in einer Tabelle die Kombination: Das ist natürlich eine Lösung, aber ich normalisiert aus bla aus Performance-Gründen, wie ich Foo.find(1).bars viel zu nennen brauchen, aber nur selten brauchen bla.

Foo.find(1).bars.blas: Die blas Methode einfach nicht hier existiert

Foo.find(1).bars.map{|b| b.bla}: Dies ist die beste Abhilfe, die ich bisher gefunden habe. Das Ergebnis des Mappings ist jedoch ein Array, so dass ich später keine ActiveRecord-Methoden auf das Set anwenden kann (was das Ziel ist).

Antwort

2

Sie sollten has_many mit through Option einrichten.

class Foo < ActiveRecord::Base 
    has_many :bars 
    has_many :blas, through: :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
    has_one :bla 
end 

class Bla < ActiveRecord::Base 
    belongs_to :bar 
end 

Danach können Sie alle bla s mit bestimmten Foo weise wie folgt zugeordnet bekommen:

irb(main):001:0> Foo.last.blas 
=> <ActiveRecord::Associations::CollectionProxy [...] 

Siehe Ruby on Rails Guides für weitere Einzelheiten.

+1

und rufen Foo.find (1) .blas –