2013-01-09 20 views
6

mam ten związek między kategorii produktów & marki:Szyny HABTM dołącza

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 

Jak mogę zaznaczyć wszystkie kategorie, według określonej marki Dzięki tej relacji? próbuję to ale pojawia się błąd

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

Odpowiedz

7

Zrobiłeś słuszne z przyłączyć, wystarczy dodać bardziej złożone, gdzie definicja:

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

kontrowersyjnie HABTM są rzadko, jeśli w ogóle, dobry projekt i IMO tylko o zaledwie Rails rzeczą dostał błędne.

wprowadzić tabelę xref dołączenia do produktów i kategorii i korzystać has_many: through po obu stronach relacji więc skończyć z

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 

To daje najlepszą elastyczność z najmniejszą ilością kodu re- faktoring dla Ciebie plus dużo bardziej intuicyjne ścieżki, aby niezależnie od danych trzeba po obu stronach relacji i pozwoli osiągnąć następujące

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

Aktualizacja Powyższy kod jest całkowicie nieprzetestowany i właśnie poprawiłem rażąco głupi błąd, który popełniłem. Jeśli masz jakiekolwiek problemy wykonawcze to potem wrócić