2013-04-18 16 views
7

के साथ रेल 3 में inverse_of की सीमाएं क्या हैं I inverse_of के बारे में पढ़ रहा हूं और जो कुछ भी मैं ऑनलाइन देख रहा हूं वह असंगत लगता है और मुझे भ्रमित करता है। आप here देखो, तो आप देख सकते हैंActiveRecord

समर्थन inverse_of लिए कुछ सीमाएं हैं:

  • वे साथ काम नहीं करते: संघों के माध्यम से।
  • वे पॉलिमॉर्फिक संघों के साथ काम नहीं करते हैं।
  • वे साथ काम नहीं करते: एसोसिएशन के रूप में।
  • संबंधित संगठनों के लिए, has_many व्यस्त संघों को अनदेखा कर दिया गया है।

अभी तक सही है कि इसके बाद के संस्करण, वे इस उदाहरण

class Customer < ActiveRecord::Base 
    has_many :orders, :inverse_of => :customer 
end 

class Order < ActiveRecord::Base 
    belongs_to :customer, :inverse_of => :orders 
end 

मुझे लगता है कि वे क्या कह रहे हैं पहले inverse_of कुछ नहीं करता है, लेकिन यदि ऐसा है तो वे इसे क्यों किया दे सकता है?

इसके अलावा, यहां तक ​​कि, ऊपर बात कहते हैं inverse_of संबद्धताएं के माध्यम से साथ काम नहीं करता है, हालांकि this page कहते

आप में शामिल होने के मॉडल पर एक belongs_to का उपयोग कर रहे हैं, तो यह निर्धारित करने के लिए एक अच्छा विचार है: संघ के माध्यम से): inverse_of> belongs_to पर विकल्प है, जो मतलब है कि निम्न उदाहरण सही ढंग से काम करता है जहां> टैग एक has_many है

और इस उदाहरण देता

@post = Post.first 
@tag = @post.tags.build :name => "ruby" 
@tag.save 

अंतिम पंक्ति को रिकॉर्ड (टैगगेल) के माध्यम से सहेजना चाहिए। इस सब असंगत और अत्यधिक भ्रामक लगता है मेरे लिए

class Taggable < ActiveRecord::Base 
    belongs_to :post 
belongs_to :tag, :inverse_of => :taggings 
end 

: inverse_of सेट है: यह तभी> काम करेंगे। लेकिन आम तौर पर, मुझे हर रिश्ते पर उलटा कहने में कोई हानि नहीं होती है। क्या यही समस्या है? मैंने देखा है कि बहुत से लोग इस पर पूछते हैं और किसी से भी ठोस हां या नहीं देखा है।

उत्तर

1

हमेशा इसे निर्दिष्ट करने के लिए कोई भी असंतोष नहीं है और यह रेल वस्तुओं को ऑब्जेक्ट लोड करने का अनुकूलन करने की अनुमति देगा ताकि आप अजीब बग्स के बिना दोनों दिशाओं में एक सक्रिय रिकॉर्ड मॉडल रिलेशनशिप श्रृंखला को ऊपर और नीचे जा सकें जहां एक ऑब्जेक्ट पर एक मूल्य बदलना इसका संदर्भ नहीं बदलता है।

इसे स्थापित करने के साथ एकमात्र समस्या जहां यह काम नहीं करती है, जैसा कि आपने पहले कहा था और यदि वे चुपचाप विफल हो जाते हैं तो आपको एफ़ोर का उल्लेख बग मिल जाएगा यदि आप

को बदलने के बाद विधि श्रृंखला के गलत तरीके से जाते हैं

इस रेल एपीआई

d = Dungeon.first 
t = d.traps.first 
d.level == t.dungeon.level # => true 
d.level = 10 
d.level == t.dungeon.level # => false 

तहखाने उदाहरणों घ और ऊपर के उदाहरण डेटाबेस से एक ही वस्तु डेटा का उल्लेख में t.dungeon से है, लेकिन वास्तव में उस डेटा के विभिन्न में स्मृति प्रतियां हैं। निर्दिष्ट करना: एसोसिएशन पर inverse_of विकल्प आपको व्यस्त रिश्तों के बारे में सक्रिय रिकॉर्ड बताता है और यह ऑब्जेक्ट लोडिंग को अनुकूलित करेगा।