8

मान लें कि मेरे पास एक कोर्स है जिसमें छात्र सदस्यता के माध्यम से नामांकन कर सकते हैं (उदाहरण के लिए पाठ्यक्रम और छात्रों के has_and_belongs_to_many संबंध)। कुछ सदस्यता जो अभी (आदि क्रेडिट नहीं करने के लिए,) वर्ग देख रहे हैं छात्रों के लिए हैं, इसलिए:मैं has_many के साथ नए रिकॉर्ड कैसे बना सकता हूं: के माध्यम से और सम्मान: शर्तों?

class Course < ActiveRecord::Base 
    has_many :memberships 

    has_many :students, 
      :through => :memberships 

    has_many :observers, 
      :through => :memberships, 
      :source => :student, 
      :conditions => { :memberships => { :observer => true }} 
end 

यहाँ क्या महान काम करता है:

observers = Course.find(37).observers 

यहाँ काम नहीं करता है:

new_observer = Course.find(37).observers.build(:name => 'Joe Student') 

मैं सोचा होगा कि एक संघ का उपयोग कर नए रिकॉर्ड बना सकते हैं और है कि उत्पन्न होता है:

  1. एक नया छात्र रिकॉर्ड ('जो छात्र')
  2. एक नई सदस्यता रिकॉर्ड (course_id = 37, student_id = (जो), पर्यवेक्षक = true)

लेकिन बजाय मैं:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array 

मुझे यकीन है कि मैं इस बारे में पूरी तरह से उलझन में हूं और यह किसी भी अंतर्दृष्टि की सराहना करता हूं! मैंने सदस्यता मॉडल पर नामित स्कोप के साथ ऐसा करने का भी प्रयास किया है, लेकिन मुझे लगता है कि एसोसिएशन में एक दायरा का उपयोग करने के लिए है Imany।

किसी भी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

6

मेरा मानना ​​है कि आपको रेल बग का सामना करना पड़ा है। मैंने अपने बॉक्स (2.3.4) पर एक ही चीज़ की कोशिश की और यह मुझे वही त्रुटि देता है जो बिल्कुल सही नहीं लगता है। साथ ही मैं यह भी की चारों ओर काम करने की कोशिश की:

course = Course.first 
course.observers << Student.create(:name => "Joe Student") 
course.save 

लेकिन इस झूठी के लिए पर्यवेक्षक क्षेत्र सेट के साथ एक सदस्यता बनाता है!

अंतिम बदसूरत वैकल्पिक हल मैं मैन्युअल Membership रिकॉर्ड बनाने गया था के साथ आया था:

Membership.create!(:course => Course.first, :student => Student.first, :observer => true) 

मैं created a ticket for this है है और मैं नाश्ते के बाद आगे की जांच करेंगे।

संपादित: मैं है, के रूप में वादा किया था, आगे की जांच की और यदि आप इस तरह के रूप में एक सरणी के लिए अपने :conditions हैश बदल पाया:

:conditions => ["memberships.observer = ?", true] 

यह काम करता है के रूप में इरादा। मेरे पास github repository भी उदाहरण कोड और डुप्लिकेट के निर्देश हैं।

+0

धन्यवाद !! बहुत उपयोगी! हां, अभी भी काफी 100% नहीं है। पर्यवेक्षक बूलियन एसक्यूएल में सेट नहीं है: c.observers.create! (: Name => 'abby') => छात्र "(" नाम "," अपडेट_ट "में छात्र बनाएं (2.0ms) इंसर्ट करें, "बनाया_at") VALUES ('abby', '200-1-0-04 12:41:35', '2009-10-04 12:41:35') सदस्यता बनाएं (0।0 एमएमएस) "सदस्यता" ("पर्यवेक्षक", "अपडेट_एट", "student_id", "course_id", " बनाया_at" में प्रवेश करें) मूल्य (पूर्ण, '200 9 -10 12:41:35', 4, 2, '2009-10-04 12:41:35') ** पर्यवेक्षक के लिए मूल्य (एनयूएलएल) नोट करें। – Eric

+0

बेवकूफ सवाल: क्या यह मुद्दा अभी भी मौजूद है या रिकॉर्ड बनाने के दौरान हैश की स्थिति ठीक काम करती है? (सेटिंग 'पर्यवेक्षक: सत्य')। या शायद एक बेहतर तरीका है (हम रेल 4 के बारे में बात कर रहे हैं) –