रूबी ऑन रेल्स। मैं कैसे सक्रिय रिकॉर्ड .build विधि का उपयोग करते हैं: रिश्ते के अंतर्गत आता है?


128

मैं (। वर्तमान में 2.0.2 का उपयोग कर रहा हूँ) में .build विधि पर कोई भी दस्तावेज़ खोजने में असमर्थ रहा हूँ।

प्रयोग के माध्यम से ऐसा लगता है कि आप रिकॉर्ड has_manyबनाने से पहले किसी रिकॉर्ड में सहेजने के लिए बिल्ड विधि का उपयोग कर सकते हैं ।

उदाहरण के लिए:

class Dog < ActiveRecord::Base
  has_many :tags
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :dogs
end

# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true

यह कुत्ते और टैग दोनों को विदेशी कुंजी के साथ ठीक से बचाएगा। यह एक belongs_toरिश्ते में काम करने के लिए नहीं लगता है ।

d = Dog.new
d.person.build # => nil object on nil.build

मैंने भी कोशिश की है

d = Dog.new
d.person = Person.new
d.save # => true

Dogइस मामले में विदेशी कुंजी इस तथ्य के कारण सेट नहीं की गई है कि जिस समय इसे बचाया गया है, उस समय नए व्यक्ति के पास आईडी नहीं है, क्योंकि यह अभी तक सहेजा नहीं गया है।

मेरे प्रश्न हैं:

  1. कैसे काम का निर्माण करता है ताकि रेल को यह पता लगाने में स्मार्ट हो कि रिकॉर्ड को सही क्रम में कैसे बचाया जाए?

  2. मैं एक belongs_toरिश्ते में एक ही काम कैसे कर सकता हूं ?

  3. मुझे इस पद्धति पर कोई दस्तावेज़ कहां मिल सकता है?

धन्यवाद


प्रलेखन के बारे में, रेल मार्गदर्शिकाएँ "द्वारा जोड़े गए तरीके belongs_to" और "तरीके जोड़े गए has_one" देखें । अधिक तकनीकी दस्तावेज एपीआई डॉक्स में पाए जा सकते हैं: belongs_toऔर has_one
डेनिस

जवाबों:


147

यह कहां प्रलेखित है:

" मॉड्यूल ActiveRecord :: संघों :: ClassMethods " में has_many एसोसिएशन के तहत एपीआई प्रलेखन से

संग्रह। नोट: यह केवल तभी काम करता है जब कोई संबद्ध वस्तु पहले से मौजूद है, न कि अगर वह शून्य है!

विपरीत दिशा में निर्माण का उत्तर थोड़ा परिवर्तित सिंटैक्स है। कुत्तों के साथ अपने उदाहरण में,

Class Dog
   has_many :tags
   belongs_to :person
end

Class Person
  has_many :dogs
end

d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")

या और भी

t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")

आप इसे तुरंत सहेजने के लिए create_dog का भी उपयोग कर सकते हैं (बहुत कुछ इसी तरह "बनाएँ" विधि जिसे आप संग्रह पर कॉल कर सकते हैं)

रेल पर्याप्त स्मार्ट कैसे है? यह जादू है (या अधिक सटीक, मुझे अभी पता नहीं है, यह पता लगाना पसंद करेंगे!)


4
@BushyMark: यह define_method के साथ उन तरीकों को जोड़ने के लिए method_missing या metaporgramming का उपयोग करता है।
फेडेरिको

@ फ़ेडरिको कहाँ गायब विधि को परिभाषित करता है?
शाम

1
@ alock27 ActiveRecord आपके find_by_emailऔर find_by_column_nameविधियों के लिए अनुपलब्ध विधि का उपयोग कैसे करता है । यह आपके द्वारा पास की गई विधि को एक स्ट्रिंग में परिवर्तित करता है और इसे विच्छेदित करता है और इसे आपकी तालिका के कॉलम नामों से मिलाने का प्रयास करता है।
बिग पोटैटो 10

@edmund आपकी टिप्पणी के लिए धन्यवाद। स्पष्ट होने के लिए, मैं समझता हूं कि method_missing कैसे काम करता है। मैं फ़ाइल के वास्तविक स्थान का पता लगाने की कोशिश कर रहा था जो इस विशेष विधि को गायब कर देता है।
जागृत करना

@ alock27 अगर आप पूछ रहे हैं क्योंकि आप यह देखना चाहते हैं कि इसे कैसे परिभाषित किया जाए तो आपको Metaprogramming Ruby की जाँच करनी चाहिए। लेकिन अगर आप वास्तव में वास्तविक स्थान की तलाश कर रहे हैं, तो आप शायद स्रोत कोड के लिए Google हो सकते हैं।
MCB

48
@article = user.articles.build(:title => "MainTitle")
@article.save

>> d.tags.build (: संख्या => "123456") >> d.save # => सत्य समान नहीं?
antiqe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.