2010-08-17 14 views
8

बनाई गई है मैं एक माता पिता और बच्चे के मॉडल रिश्ता है। बच्चे की migration.rb में, बच्चे को मॉडल के कॉलम प्रत्येक (PARENT_ID स्तंभ को छोड़कर) डिफ़ॉल्ट मान है।रूबी ऑन रेल्स: मूलभूत मूल्यों के साथ एक बच्चे का निर्माण जब अपनी मूल

जब मैं एक नया पैरेंट ऑब्जेक्ट करता हूं, तो मैं इसे कैसे बना सकता हूं ताकि एक बच्चे ऑब्जेक्ट बनाया जा सके और मूल तालिका के साथ मूल मानों के डेटा के साथ अपनी तालिका में सहेजा जा सके?

मुझे लगता है कि इसे मूल मॉडल पर after_create जैसे कुछ करना होगा, लेकिन मुझे यकीन नहीं है कि इसे कैसे सेट अप किया जाए।

उत्तर

12

संशोधित: मैंने संबंधित मॉडल बनाने से पहले, निर्माण और निर्माण, निर्माण, उपयोग करने के लिए उत्तर संशोधित किया। एक बार माता-पिता को सहेजने के बाद ActiveRecord मशीनरी संबंधित मॉडल को सहेजने का ख्याल रखती है।

मैं भी इस कोड का परीक्षण!

# in your Room model... 
has_many :doors 

before_create :build_main_door 

private 

def build_main_door 
    # Build main door instance. Will use default params. One param (:main) is 
    # set explicitly. The foreign key to the owning Room model is set 
    doors.build(:main => true) 
    true # Always return true in callbacks as the normal 'continue' state 
end 

####### has_one case: 

# in your Room model... 
has_one :door 
before_create :build_main_door 
private 
def build_main_door 
    # Build main door instance. Will use default params. One param (:main) is 
    # set explicitly. The foreign key to the owning Room model is set 
    build_door(:main => true) 
    true # Always return true in callbacks as the normal 'continue' state 
end 

जोड़ा गया ...

निर्माण विधि has_many बयान से, स्वामित्व वाली मॉडल की मशीनरी द्वारा जोड़ा जाता है। चूंकि उदाहरण है has_many: दरवाजे (मॉडल नाम द्वार), बिल्ड कॉल दरवाजे हैं। बिल्ड

docs for has_many और has_one को जोड़े गए सभी अतिरिक्त तरीकों को देखने के लिए देखें।

# If the owning model has 
has_many :user_infos # note: use plural form 

# then use 
user_infos.build(...) # note: use plural form 

# If the owning model has 
has_one :user_info  # note: use singular form 

# then use 
build_user_info(...) # note: different form of build is added by has_one since 
        # has_one refers to a single object, not to an 
        # array-like object (eg user_infos) that can be 
        # augmented with a build method 

रेल 2.x ने एसोसिएशन के लिए ऑटोओव विकल्प पेश किया। मुझे नहीं लगता कि यह उपरोक्त पर लागू होता है (मैं डिफ़ॉल्ट रूप से उपयोग कर रहा हूं)। Autosave testing results.

+0

मेरे उदाहरण में बाल मॉडल को "user_info" कहा जाता है, जब मैं 'user_info.create (: main => true) 'त्रुटियों को करने का प्रयास करता हूं और कहता है' अपरिभाषित विधि के लिए \ 'create' विधि: NilClass' – Reti

+0

वास्तव में, मॉडल को तकनीकी रूप से 'userInfo' – Reti

+0

कहा जाता है' UserInfo.create' – zetetic

0

आप (या मैं इसे overread) संबंध किस तरह का प्रयोग कर रहे हैं निर्दिष्ट नहीं किया। आप इस तरह के "has_one" के रूप में, एक एक-से-एक संबंध का उपयोग कर रहे हैं अभ्यस्त काम पैदा करते हैं। इस मामले में आप कुछ इस तरह उपयोग करने के लिए है: के रूप में अच्छी parent.rb

has_one :child 
before_create {|parent| parent.build_child(self)} 

after_create काम हो सकता है में

, havent कि परीक्षण किया गया।

child.rb में जबकि

belongs_to :parent 

मैं इस काफ़ी के साथ संघर्ष कर रहा था जब मेरे वर्तमान आवेदन में एक उपयोगकर्ता मॉडल की स्थापना।

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html आपको लगता है कि has_one parent.build का समर्थन नहीं करता या parent.create

आशा इस मदद करता है देख सकते हैं। मैं खुद रूबी के लिए नया हूं और धीरे-धीरे रूबी जंगल के माध्यम से अपना रास्ता बनाना शुरू कर रहा हूं। एक अच्छी यात्रा लेकिन खोने में आसान। :)

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