2012-01-08 11 views
6

मेरे पास एक आइटम संसाधन और एक मालिक संसाधन है।मैं मौजूदा नेस्टेड विशेषता का संदर्भ देने वाला एक नया ऑब्जेक्ट कैसे बना सकता हूं?

rails g scaffold Item name:string 
rails g scaffold Owner name:string 

class Item < ActiveRecord::Base 
    has_one :owner 
    accepts_nested_attributes_for :owner 
end 

class Owner < ActiveRecord::Base 
    belongs_to :item 
end 

मेरी समस्या यह है कि मैं एक मौजूदा मालिक ऑब्जेक्ट का संदर्भ देने वाला एक नया आइटम ऑब्जेक्ट नहीं बना सकता।

In /db/migrate/create_owners.rb 
def self.up 
    ... 
    t.integer :item_id 
end 

rake db:migrate 
rails c 

ruby-1.9.2-p0 > o= Owner.create(:name => "Test") 
=> #<Owner id: 1, name: "Test", created_at: "...", updated_at: "..."> 

ruby-1.9.2-p0 > i= Item.create(:owner_attributes => {"id" => Owner.last.id.to_s}) 
ActiveRecord::RecordNotFound: Couldn't find Owner with ID=1 for Item with ID= 

मुझे पता है कि Item.create(:owner_id => "1") इस मामले में काम करेगा हूँ, लेकिन दुर्भाग्य से मेरे एप्लिकेशन में यह नहीं एक व्यवहार्य समाधान। ऐसा इसलिए है क्योंकि मैं फ्लाई पर नेस्टेड विशेषताओं को जोड़ रहा हूं और हटा रहा हूं, उदाहरण के लिए, एक मौजूदा आइटम ऑब्जेक्ट और एक नई स्वामी ऑब्जेक्ट के साथ एक नया आइटम ऑब्जेक्ट बनाने की आवश्यकता है।

मैं इन कड़ियों पाया, लेकिन ऐसा नहीं हो सकता है अगर यह एक सुविधा या रेल में एक बग है:
https://rails.lighthouseapp.com/projects/8994/tickets/4254-assigning-nested-attributes-fails-for-new-object-when-id-is-specified
http://osdir.com/ml/RubyonRails:Core/2011-05/msg00001.html

किसी ने मुझसे कैसे मैं यह काम कर सकते हैं के रूप में एक विचार दे सकते हैं या क्या मैंने 'accepts_nested_attributes_for' का उपयोग करने के सही तरीके को गलत समझा है ??

मैं रेल 3.0.5 और रूबी 1.9.2p0 का उपयोग कर रहा हूं।

अग्रिम धन्यवाद।

उत्तर

1

आप नेस्टेड विशेषताओं में स्वामी आईडी के साथ एक Item बनाने के लिए प्रयास करते हैं, यह ActiveRecord बताता है एक मौजूदा Owner रिकॉर्ड को अपडेट करने। ActiveRecord स्वामी रिकॉर्ड नहीं ढूंढ सकता क्योंकि कोई मौजूदा विदेशी कुंजी मान नहीं है (आइटम रिकॉर्ड के लिए आईडी अभी भी शून्य है)।

Item.create(:owner_attributes => {"id" => Owner.last.id.to_s}) 
#=> ActiveRecord::RecordNotFound: Couldn't find Owner with ID=1 for Item with ID= 

has_one/belong_to associtaions को स्वैप करने का प्रयास करें और आइटम कुंजी पर विदेशी कुंजी को स्थानांतरित करें। फिर आप पैरेंट (नेस्टेड नहीं) मॉडल में विदेशी कुंजी सेट कर सकते हैं और अभी भी नेस्टेड विशेषताओं का उपयोग कर सकते हैं।

class Item < ActiveRecord::Base 
    belongs_to :owner 
    accepts_nested_attributes_for :owner 
end 

class Owner < ActiveRecord::Base 
    has_one :item 
end 

owner = Owner.create 

Item.create(:owner_id => owner.id, :owner_attributes => {"id" => owner.id, ...}) 
#=> Works!!! Note that the owner id is used twice. With some work you could probably set the id in one place or the other. 
+0

धन्यवाद! मैंने इस परियोजना पर एक साल से अधिक समय तक काम नहीं किया है, लेकिन आपका जवाब समझ में आता है। जब मैं एक पल करता हूं तो मैं इसे (ब्याज से बाहर) कोशिश करूंगा। –

0

accepts_nested_attributes_for केवल has_one और has_many संघों के लिए उपयोग किया जाता है। (देखें http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html कोई संबंधित नहीं है) इसे 'नेस्टेड' कहा जाता है इसलिए वहां बहुत मदद नहीं होती है। शायद आपके ऐप को दोबारा दोहराएं?

विशेष रूप से आपके द्वारा सामना किए जा रहे त्रुटि मामले का कारण यह है कि यह अपेक्षा करता है कि अभिभावक नेस्टेड मॉडल की आईडी को देखते हुए नेस्टेड मॉडल ढूंढने में सक्षम होना चाहिए। अर्थात।

parent.nested_model.find(id) 

यह वहाँ ऐसा लगता है, मूल रूप से बच्चे के मॉडल है कि माता-पिता

+0

धन्यवाद। मैंने has_one का उपयोग करने के लिए उदाहरण बदल दिया। दुर्भाग्य से, समस्या बनी रहती है। क्या मैं कोशिश कर रहा हूं कि हासिल करने का कोई तरीका है, या क्या मैं ड्राइंग बोर्ड पर वापस जाने से सबसे अच्छा हूं? –

+0

सच नहीं है, यह belong_to के लिए काम करेगा, वहां बस इसका एक उदाहरण नहीं है। यदि है_ऑन काम करता है, तो belong_to भी काम करेगा। –

+0

@RyanBigg हम्म, मैंने गलत तरीके से पढ़ा होगा कि कैसे घोंसला काम करता है। यदि है_ऑन काम करता है तो हाँ 'belong_to' काम होना चाहिए। @ जैक नहीं, ऐसा लगता है कि यह एक समस्या है जैसे लाइटहाउस लिंक (https://rails.lighthouseapp.com/projects/8994/tickets/4254-assigning-nested-attributes-fails-for-new-object-when-id- निर्दिष्ट है # टिकट -4254-6) आपने पोस्ट किया है। –

2

मैं इस समस्या का एक और तरीका हल से संबंधित नहीं अद्यतन करने से रोकने के लिए और मामले में यहाँ यह का एक सरलीकृत संस्करण पोस्ट करने के लिए चाहता था करने के लिए यह किसी और की मदद करता है। मेरे असली ऐप में दोनों संसाधनों के बीच आकलन एचएबीटीएम है और नेस्टेड संसाधन एक फाइल अटैचमेंट है।

तो, नियंत्रक की निर्माण कार्रवाई में, मैं मूल संसाधन और नेस्टेड संसाधन के लिए पैरामीटर अलग करता हूं।

मैं फिर नेस्टेड संसाधन को उन ऑब्जेक्ट्स में अलग करता हूं जो डेटाबेस और ऑब्जेक्ट्स में मौजूद हैं जो नहीं करते हैं, जो सरणी में करते हैं।

यदि कोई मौजूदा नेस्टेड ऑब्जेक्ट मौजूद नहीं है, तो यह यहां से सादा नौकायन है।
@item = Item.new(:attachment_ids => existing_attachment_ids)

उसके बाद मैं @item इस प्रकार अद्यतन:

हालांकि, यह मानते हुए दोनों मौजूदा और नए नेस्टेड वस्तुओं रहे हैं वर्तमान में, मैं इस तरह एक नया आइटम वस्तु बनाने
@item.update_attributes(original_item_params)
@item.update_attributes(params_for_new_nested_objects)

तो फिर तुम फोन कर सकते हैं @item.save और यदि कोई त्रुटियां होती हैं तो इसे दृश्य को फिर से प्रस्तुत करें।

यदि यह एक बग या फीचर आईआर रेल है तो भी मैं काम नहीं कर सकता।अगर किसी के पास इस विषय या मेरे समाधान पर कोई विचार है, तो मुझे उन्हें सुनकर बहुत खुशी होगी।

+0

बस एफवाईआई, यह पुराना रेल टिकट भी देखें: https://rails.lighthouseapp.com/projects/8994/tickets/4254-assigning-nested-attributes-fails-for- new-object-when-id-is- निर्दिष्ट –

0

इस प्रकार मैंने कुछ ऐसा हासिल किया, हालांकि सही नहीं था। एक नज़र देख लो! मेरा परीक्षण अभी भी बहुत विफल रहता है क्योंकि मुझे फैक्टरी गर्ल बेहतर नहीं है।

creating an object with has_many association results in item can not be blank

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

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