2012-08-15 13 views
5

में जोड़ें विधि जोड़ना मेरे पास मॉडल श्रेणी और उत्पाद हैं। अगर मैं category.products << new_product का उपयोग करता हूं तो आइटम सरणी में जोड़ा जाता है और रिकॉर्ड डेटाबेस में सहेजा जाता है। मैंने सरणी वर्ग में निम्न "जोड़ें" विधि जोड़ने का प्रयास किया और जब यह सरणी में new_product जोड़ता है, तो यह इसे डेटाबेस में सहेजता नहीं है। ऐसा क्यों है?ActiveRecord सरणी

class Array 
    def add(item) 
    self << item 
    end 
end 

अद्यतन:

collection_proxy.rb निम्न विधि है:

def <<(*records) 
    proxy_association.concat(records) && self 
end 
alias_method :push, :<< 

तो निम्न एक्सटेंशन काम करता है:

class ActiveRecord::Relation 
    def add(*records) 
    proxy_association.concat(records) && self 
    end 
end 

समाधान:

CollectionProxy करने के लिए एक अन्य नाम जोड़ें:

class ActiveRecord::Associations::CollectionProxy 
    alias_method :add, :<< 
end 
+0

क्योंकि रेल संघों सरणियों नहीं हैं, वे तो बस का दावा वे कर रहे हैं । –

+0

तब वे क्या हैं? मैं एक "जोड़ें" विधि कैसे जोड़ सकता हूं? – Manuel

उत्तर

2

संपादित करें:

यह आरंभ करना चाहिए: मैनुअल एक बेहतर समाधान

class ActiveRecord::Associations::CollectionProxy 
    alias_method :add, :<< 
end 

मूल समाधान मिल गया। यह सही नहीं है। एक मैं निम्नलिखित उदाहरण के लिए था

class ActiveRecord::Relation 
    def add(attrs) 
    create attrs 
    end 
end 

बजाय अपने मॉडल के नाम के साथ एक नई रेल परियोजना को आग, मैं सिर्फ इस्तेमाल किया:

1.9.3p194 :006 > Artist.create(:first_name => "Kyle", :last_name => "G", :email => "[email protected]") 
=> #<Artist id: 5, first_name: "Kyle", last_name: "G", nickname: nil, email: "[email protected]", created_at: "2012-08-16 04:08:30", updated_at: "2012-08-16 04:08:30", profile_image_id: nil, active: true, bio: nil> 
1.9.3p194 :007 > Artist.first.posts.count 
=> 0 
1.9.3p194 :008 > Artist.first.posts.add :title => "Foo", :body => "Bar" 
=> #<Post id: 12, title: "Foo", body: "Bar", artist_id: 5, created_at: "2012-08-16 04:08:48", updated_at: "2012-08-16 04:08:48"> 
1.9.3p194 :009 > Artist.first.posts.count 
=> 1 
+0

धन्यवाद। क्या आप जानते हैं कि जब आप नया रिकॉर्ड जोड़ते हैं तो हैश के रूप में नहीं बल्कि यह ऑब्जेक्ट पास करने में विफल क्यों होता है? (मुझे "NoMethodError: अपरिभाषित विधि 'stringify_keys'" मिल रहा है) – Manuel

+0

@ मैनुअल हां, 'add' 'create' को कॉल कर रहा है और यह एक हैश के रूप में गुणों की अपेक्षा करता है। आप 'item item.attributes' जैसी चीज़ को विधि में बदल सकते हैं लेकिन आपको संरक्षित विशेषताओं के साथ कुछ समस्याएं मिल सकती हैं। ऑब्जेक्ट से आपको जो चाहिए उसे चुनने पर विचार करें। – Kyle

+0

काफी नहीं :(item.attributes डेटाबेस में रिकॉर्ड बनाता है लेकिन संबंध नहीं बनाता है (आपके मामले में artist_id शून्य है) – Manuel