2013-01-09 11 views
6

Ich habe diese Beziehung zwischen Kategorien, Produkten & Marken:Rails HABTM verbindet

class Brand < ActiveRecord::Base 
    has_many :products 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products 
end 

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
    belongs_to :brand 
end 

Wie kann ich alle Kategorien auswählen, indem angegebene Marke mit diesen Beziehungen? Ich versuche, dies aber einen Fehler

b = Brand.find(1) 
Category.joins(:products).where(:products => b.products) 

Antwort

7

haben Sie das Richtige mit dem verbinden, fügen Sie einfach eine komplexere wo Definition:

Category.joins(:products).where(:products => {:brand_id => 1}) 
4

Kontrovers HABTM die selten sind, wenn überhaupt, ein gutes Design und IMO nur über den einzige Sache, Rails bekam falsch.

Einführung eines xref-Tabelle Produkte und Kategorien und Verwendung has_many verbinden: auf beiden Seiten der Beziehung durch, so dass Sie am Ende mit

class Brand < ActiveRecord::Base 
    has_many :products 
    has_many categories :through => products # This is now allowed in Rails 3.x and above 
end 

class Category < ActiveRecord::Base 
    belongs_to :product_category 
    has_many :products :through => product_category 
end 

class Product < ActiveRecord::Base 
    belongs_to :brand 
    belongs_to :product_category 
    has_many :categories :through => product_category 
end 

class ProductCategory < ActiveRecord::Base 
    has_many :products 
    has_many :categories 
end 

Dies gibt Ihnen die beste Flexibilität mit der geringsten Menge an Code wieder- Factoring für Sie plus eine viel intuitiver Weg, was auch immer Daten, die Sie auf beiden Seiten der Beziehung müssen zu erhalten und ermöglicht es Ihnen, die folgende

b = Brand.find(1) 
b.categories.all 

aktualisierenzu erreichenDer obige Code ist völlig ungeprüft und ich habe gerade einen grell blöden Fehler korrigiert, den ich gemacht habe. Wenn Sie irgendwelche Probleme haben, die Umsetzung dieses dann wieder