2011-02-06 10 views
19

ठीक है, तो यह सौदा है। मेरे पास दो टेबल और एक जॉइन टेबल है क्योंकि यह कई से अधिक रिश्ते हैं। मेरे पास एक ऑर्डर है और ऑर्डर में कई उत्पाद हो सकते हैं। स्पष्ट रूप से यह दूसरी तरफ जाता है क्योंकि उत्पाद कई ऑर्डर पर हो सकते हैं। मैं निम्नलिखित वर्गों मिल गया है:रेल 3 है_मनी: नामकरण समस्या

class Order < ActiveRecord::Base 
    has_many :orders_products 
    has_many :products, :through => :orders_products 
end 

class OrderProduct < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :product 
end 

class Product < ActiveRecord::Base 
    has_many :orders_products 
    has_many :orders, :through => :orders_products 
end 

मैं प्रदर्शित करने के लिए एक पृष्ठ मिल रहा है और मैं सामान में प्रवेश कर सकती हूं और मैं हो रही है जब मैं @order.products के माध्यम से बचाया आदेश पर उत्पादों के साथ बातचीत करने के लिए जाना निम्न त्रुटि:

SQLite3::SQLException: no such table: order_products: SELECT "products".* FROM "products" INNER JOIN "order_products" ON "products".id = "order_products".product_id WHERE (("order_products".order_id = 1)) 

में शामिल होने अपनी तालिका orders_products नाम पर है, लेकिन जैसा कि आप देख सकते हैं यह order_products के माध्यम से शामिल होने के लिए कोशिश कर रहा है। रेल नामकरण सम्मेलनों का मेरा सीमित ज्ञान मुझे बताता है कि orders_products इसे नाम देने का सही तरीका है, और फिर मेरे मॉडल को OrderProduct के रूप में नाम दें। मैं वास्तव में इस पर एक दीवार के खिलाफ अपने सिर तेज़ कर रहा हूँ।

संपादित करें: मुझे लगता है कि यह मेरे आदेश को सहेजने के बावजूद और मैंने कई चेकबॉक्स चयनित किए हैं, इसने orders_products तालिका में किसी भी मूल्य को सहेज नहीं लिया है, संभवत: उसी कारण से यह अब त्रुटि हो रहा है।

उत्तर

27

orders_products एक has_many :through रिश्ते के लिए सही नामकरण परंपरा नहीं है - यह एक has_and_belongs_to_many रिश्ते के लिए सही है। has_many :through में, "शामिल" मॉडल सिर्फ शामिल होने के लिए नहीं है - यह भी अपना स्वयं का मॉडल है जिसका अपना डेटा है, भी दो अन्य मॉडलों में शामिल होने के लिए होता है।

यदि आपके OrderProduct मॉडल में इसका कोई भी डेटा, तर्क या बाधा नहीं है, तो आप इसके बजाय has_and_belongs_to_many संबंध का उपयोग कर सकते हैं, मॉडल को पूरी तरह से हटा सकते हैं, और फिर आपकी जॉइन टेबल का नाम सही है। अन्यथा, इसे नियमित मॉडल नामकरण सम्मेलनों के अनुसार नामित किया गया है, अर्थात् order_products

+0

उचित 'has_many: through' एसोसिएशन के उदाहरण के लिए [इस विषय के लिए मार्गदर्शिका] (http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association) देखें। –

+3

आह देखें, मैंने सोचा था कि habtm बहिष्कृत किया गया था। – MattC

+0

हालांकि ऐसा लगता है कि मेरी समस्या ठीक हो गई है, इसलिए आपको एक सितारा मिल गया है। इसके अलावा, एक स्वीकार्य उत्तर के लिए 5 अंक: डी – MattC

संबंधित मुद्दे