2013-01-09 26 views
6

मैं श्रेणियों के बीच इस संबंध है, उत्पादों & ब्रांडों:रेल habtm मिलती

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 

मैं इस संबंध के साथ निर्दिष्ट ब्रांड द्वारा सभी श्रेणियों का चयन कैसे कर सकते हैं? मैं यह कोशिश लेकिन एक त्रुटि

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

उत्तर

7

आप के साथ सही काम में शामिल होने के लिए, बस जोड़ने के लिए किया था एक अधिक जटिल जहां परिभाषा:

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

विवादास्पद HABTM के कम ही होते हैं, एक अच्छा डिजाइन मिल अगर कभी और IMO बस के बारे में केवल एक चीज रेल गलत मिला है। ताकि आप

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 

अंत रिश्ते के दोनों किनारों पर के माध्यम से यह आपको कोड फिर से कम से कम राशि के साथ सबसे अच्छा लचीलापन प्रदान करता है:

उत्पादों और श्रेणियों और उपयोग has_many में शामिल होने का xref तालिका का परिचय आप के लिए फैक्टरिंग के साथ साथ एक बहुत अधिक सहज ज्ञान युक्त पथ जो कुछ डेटा आप रिश्ते के दोनों तरफ की जरूरत है और प्राप्त करने के लिए निम्नलिखित

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

अपडेट कर सकेंगे प्राप्त करने के लिए +०१२३५१६४१०६१उपरोक्त पूरी तरह से अनचाहे कोड है और मैंने अभी एक चमकदार बेवकूफ गलती को सही किया है। आप इस को लागू करने में कोई समस्या हो तो वापस आ