2010-06-30 9 views
5

निम्न सेटअप पर विचार करें:रेल में, मैं डेटाबेस से गुजरने के बिना, संबंधित_to एसोसिएशन पर ऑब्जेक्ट को कैसे पुनर्प्राप्त कर सकता हूं?

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

और यह कंसोल सत्र:

>> p = Parent.find 41 
>> p.some_attr = 'some_value' 
>> c = p.children.build 
>> c.parent 

मेरी लॉग फ़ाइलों को देखकर, मैं देख सकता हूं कि c.parent मूल ऑब्जेक्ट के लिए डीबी से पूछताछ कर रहा है। मैं मौजूदा इन-मेमोरी ऑब्जेक्ट (पी) तक पहुंचने के बजाय चाहता हूं, क्योंकि मुझे माता-पिता के कुछ_एटरआर मान तक पहुंच की आवश्यकता है, जो अभी तक डेटाबेस में संग्रहीत नहीं है। ऐसा करने का कोई रास्ता नहीं है? c.parent (force_reload = false) मुझे वहां नहीं लाता है।

उत्तर

5

आप इसका उपयोग कर सकते हैं: इसे सेट करने के लिए inverse_of। इसके बारे में here के बारे में और पढ़ें।

+0

हां,: इस आवश्यकता को पूरा करने के लिए inverse_of विकसित किया गया था। – KenB

1

ActiveRecord यह गारंटी देने का प्रयास नहीं करता है कि उसी डेटाबेस ऑब्जेक्ट्स के लिए मेमोरी ऑब्जेक्ट्स समान हैं। यह ऐसा कुछ है जो डेटामैपर गारंटी देता है।

मुझे एहसास है कि आपका उदाहरण शायद आपके प्रश्न पूछने के लिए सरलीकृत है, लेकिन केवल एक बेवकूफ देखो से - आप c.parent के बजाय पी का उपयोग क्यों नहीं करते?

एक और संभवतः उपयोगी सुझाव, डाटाबेस के लिए माता-पिता के लिए अद्यतन को बचाने:

p = Parent.find 41 

# do this... 
p.some_attr = 'some_value' 
p.save 

# OR this... 
p.update_attribute(:some_attr, 'some_value') 

c = p.children.build 
c.parent 

मैं अगर c.parent(false) ("डाटाबेस से फिर से लोड नहीं है") यकीन नहीं है यहाँ चाल क्या करेंगे, के बाद से यह एक ताजा बाल वस्तु है। लेकिन आप भी कोशिश कर सकते हैं।

+0

आप वास्तविक उदाहरण में सही उदाहरण के बारे में सही हैं - वास्तविक जीवन में मैं एक सत्यापन परिदृश्य के साथ काम कर रहा हूं जिसमें बच्चे की वैधता माता-पिता के गुणों (वास्तव में, एक भाई वस्तु संग्रह के गुण) पर निर्भर करती है। तो बच्चे के ऑब्जेक्ट के सत्यापन कोड में मुझे माता-पिता के रूप में जाना आवश्यक है क्योंकि यह स्मृति में मौजूद है, सभी विशेषताओं को जो एचटीएमएल फॉर्म सबमिट किए जाने पर अभी असाइन/अपडेट किया गया है, और डीबी में बैठे पुराने संस्करण नहीं । मैं accepts_nested_attributes_for का उपयोग कर रहा हूं: बच्चों, इसलिए मुझे पता है कि सबकुछ स्थापित है क्योंकि मुझे इसे स्मृति में चाहिए। – KenB

+1

आप लेनदेन में पूरी चीज कर सकते हैं - इस तरह आप माता-पिता को सहेज सकते हैं, फिर सत्यापन विफल होने पर सत्यापन की जांच करें, आप वापस रोल करें। –

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

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