2012-02-23 17 views
18

मेरा मतलब यह है कि यदि मेरे पास दो मॉडल हैं, जो has_and_belongs_to_many एसोसिएशन से जुड़े हैं, तो क्या मैं प्रत्येक एसोसिएशन के लिए जॉइन टेबल में अन्य डेटा स्टोर कर सकता हूं? यही है, अतिरिक्त डेटा किसी भी तालिका में एक रिकॉर्ड का हिस्सा नहीं होगा, बल्कि उनके बीच कनेक्शन की बजाय।रेल: क्या है_and_belongs_to_many एसोसिएशन में अतिरिक्त विशेषता जोड़ना संभव है?

class Part < ActiveRecord::Base 
    has_and_belongs_to_many :assemblies 
    has_and_belongs_to_many :packages 
    belongs_to :user 

    validates :name, :user_id, :presence => true 
end 

class Package < ActiveRecord::Base 
    has_and_belongs_to_many :parts 
    belongs_to :user 
end 

तो मुद्दा यह है कि प्रत्येक भाग कई पैकेज में उपलब्ध है, और प्रत्येक पैकेज विभिन्न भागों में है:

मेरे वास्तविक मॉडल इस प्रकार हैं। जो मैं जोड़ना चाहता हूं वह एक मात्रा है। यह प्रत्येक भाग की मात्रा नहीं होगी, बल्कि प्रत्येक भाग के प्रत्येक पैकेज की होगी।

मुझे यह नहीं पता कि ActiveRecord में यह कैसे करें। अगर मैं रेल/activerecord का उपयोग नहीं कर रहा था, तो मैं सिर्फ जॉइन टेबल में मात्रा कॉलम जोड़ता हूं जो भागों को संकुल से संबंधित करता है। मैं स्पष्ट रूप से माइग्रेशन में यह परिवर्तन कर सकता हूं, लेकिन मैं ActiveRecord का उपयोग करके मूल्य का उपयोग कैसे करूं?

उत्तर

25

संक्षिप्त उत्तर नहीं, आप एक एचएबीटीएम रिश्ते के साथ नहीं कर सकते हैं। यह केवल कई रिश्तों के लिए सरल है।

रिश्ते के माध्यम से आपको has_many का उपयोग करने की आवश्यकता होगी। इस परिदृश्य में आप एक जॉइन मॉडल (पार्टपैकेज) तैयार करेंगे जहां आप आवश्यक अतिरिक्त विशेषताओं को परिभाषित कर सकते हैं।

class Part < ActiveRecord::Base 
    has_many :part_packages 
    has_many :packages, :through => :part_packages 

    has_and_belongs_to_many :assemblies 
    belongs_to :user 

    validates :name, :user_id, :presence => true 
end 

class PartPackage < ActiveRecord::Base 
    belongs_to :part 
    belongs_to :package 
end 

class Package < ActiveRecord::Base 
    has_many :part_packages 
    has_many :parts, :through => :part_packages 
    belongs_to :user 
end 
14

वहाँ रेल गाइड अधिक विस्तार में दो विकल्पों के बीच मतभेदों को बताते हैं has_many :through और has_and_belongs_to_many महत्वपूर्ण अंतर है, हालांकि आप डेटा है कि संबंध का वर्णन जोड़ना चाहते हैं तो has_many :through का उपयोग करें और आप मॉडल का उपयोग कर सकते जो दोनों में शामिल हो जाता है।

यह वही है has_many है: Credit to the Rails guide.

+0

इस तरह की एक अच्छी रूपरेखा बनाने के लिए आपने किस कार्यक्रम का उपयोग किया? – MicFin

+0

(मेरा आंतरिक रेफरी # 485) पूरे रिकॉर्ड बनाए जाने के साथ ही आप नियुक्ति_डेट को कैसे अपडेट करते हैं और बाद में अतिरिक्त विशेषता को आप कैसे पढ़ते हैं? मैं केवल इसे Appointment.find_by ............. के माध्यम से कर सकता हूं लेकिन मुझे रोगी की तरह कम कमजोर होना चाहिए .appointments.first.appointment_date – ace

+0

आप इस तरह नियुक्ति_डेट गुण अपडेट कर सकते हैं: belong_to: चिकित्सक ,: स्पर्श =>: upgrade_date। – hashrocket

0

वास्तव में, यह संभव है: की तरह दिखता है के माध्यम से।

1) packages_parts करने के लिए एक मात्रा कुंजी तालिका

2 में शामिल होने के जोड़े) अपने भाग मॉडल

has_and_belongs_to_many :packages, -> { select("packages.*, 
packages_parts.quantity") } 

को यह जोड़े अब आप part.packages[0].quantity कर सकते हैं, उदाहरण के लिए।

यह क्या करता है रेलवे को मात्रा कुंजी लाने के लिए बताता है जब भी यह किसी विशिष्ट भाग के लिए पैकेज प्राप्त करता है।

(यदि आप के रूप में अच्छी package.parts.first.quantity क्या करना चाहते हैं अपने पैकेज मॉडल के लिए भी ऐसा ही कर सकते हैं - 'भागों' 'के साथ संकुल' की जगह सिर्फ भी पैकेज मॉडल पर इस डाल,)

अधिक जानकारी: https://ducktypelabs.com/using-scope-with-associations/