2013-02-18 41 views
13

के रूप में यहां उनका उल्लेख:मैं हर जगह inverse_of का उपयोग क्यों नहीं करना चाहूंगा?

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

inverse_of स्मृति संघों में कैश और डेटाबेस प्रश्नों को कम करने के रेल बताने के लिए प्रकट होता है। उनके उदाहरण है:

class Dungeon < ActiveRecord::Base 
    has_many :traps, :inverse_of => :dungeon 
    has_one :evil_wizard, :inverse_of => :dungeon 
end 

class Trap < ActiveRecord::Base 
    belongs_to :dungeon, :inverse_of => :traps 
end 

कौन सा वे immediatly के साथ पालन करें:

for `belongs_to` associations `has_many` inverse associations are ignored. 

तो मैं कई प्रश्न हैं।

  1. के लिए has_many पर उलटा संघों को नजरअंदाज कर दिया गया है? यदि हां, तो उनके उदाहरण को कैसे समझ में आता है? क्या यह कुछ भी नहीं करना चाहिए?
  2. जहां तक ​​मेरा (यह मानते हुए यह कुछ भी करता है) बता सकते हैं सभी यह करने के लिए अनुमति देता है की तरह कुछ:

    dungeon.traps.first.dungeon 
    
    .dungeon करने के लिए अंतिम कॉल एक पूरी नई क्वेरी नहीं पैदा करने, लेकिन केवल के लिए तक पहुँचने के साथ

    मेमोरी एसोसिएशन में मान लीजिए कि यह सही है, मैं कभी भी उस व्यवहार को क्यों नहीं चाहूंगा? मैं सिर्फ एसोसिएशन पर inverse_of: क्यों नहीं रखूंगा?

उत्तर

6

मैं रेल के बारे में लिखना शुरू किया Inflector और कैसे एक संघ एक मॉडल आप inverse_of का उपयोग से संकेत मिलता है कि यह क्या है की एक सीधी मोड़ नहीं है जब। लेकिन फिर मैंने आपके द्वारा उल्लिखित अनुभाग में स्क्रॉल किया और इस तरह मैं इसे देखता हूं।

# let's pick a dungeon 
d = Dungeon.first 

# say you find also find a trap that belongs to this particular d 
t = Trap.find(...) 

# then t.dungeon is the exact same object as d 
d == t.dungeon 

पाठ्यक्रम dungeon.traps.first.dungeon का वास्तव में मतलब नहीं है और मुझे शक है कि इस कारण है कि उपलब्ध है: आप की तरह कुछ है कहो। व्यक्तिगत रूप से मैं नहीं देखता कि मैं कहां और कैसे इसका उपयोग करूंगा लेकिन उनके द्वारा दिया गया उदाहरण एक उपयोग केस भरना प्रतीत होता है। यह इस प्रकार है:

# you have an attribute level on dungeon 
d.level # => 5 

# now say you have a comparison after a modification to level 
d.level = 10 

# now without inverse_of the following thing occurs 
d.level   # => 10 
t.dungeon.level # => 5 

# d was updated and since t.dungeon is a whole different object 
# it doesn't pick up the change and is out of sync but using invers_of you get 
d.level   # => 10 
t.dungeon.level # => 10 

# because d and t.dungeon are the very same object 

आशा है कि चीजें स्पष्ट करता है।

+0

तो इसका मतलब यह है कि अगर मैं t.dungeon.level = 10 (d.level = 10 के बजाय) कहने के लिए थे, कि d.level भी अपडेट नहीं हैं अगर मैं उलटा हुआ हूं क्योंकि इसे अनदेखा किया गया था? और आम तौर पर, संग्रह के सदस्य को अपडेट करने से उस सदस्य के अन्य उदाहरणों को सिंक नहीं किया जाएगा? लेकिन यह अभी भी हर जगह उलटा करने में कोई समस्या नहीं प्रतीत होता है, कम से कम उम्मीद है कि वे अंततः इसका समर्थन करते हैं, है ना? – bdwain

+0

@bdwain यह मेरे लिए बहुत दिलचस्प है, क्योंकि मैं हमेशा सोचता हूं कि रेल ने इस 'inverse_of' रिश्ते को स्वचालित रूप से अनुमानित किया है (यदि नाम मिलान किए गए हैं)। हाल ही में इस पर आने के बाद (एक मॉडल पर सत्यापन करते समय 'accepts_nested_attributes_for' संबंधित मॉडल), मुझे आपके निष्कर्ष से सहमत होना होगा: उदारता से' inverse_of' का उपयोग करें। मैं किसी भी कारण की कल्पना नहीं कर सकता। – steve

4

ग्रेट न्यूज! रेल 4.1 में मूल संघ * स्वचालित रूप सेinverse_of सेट अप करेगा।

* अधिक सुविधा का अर्थ है किनारे के मामलों ... स्वचालित inverse_of संघों ऐसा के लिए ही काम करता है निम्न विकल्पों में से किसी भी निर्दिष्ट नहीं:

  • :through
  • :foreign_key
  • :conditions
  • :polymorphic

संसाधन:

http://edgeguides.rubyonrails.org/4_1_release_notes.html http://wangjohn.github.io/activerecord/rails/associations/2013/08/14/automatic-inverse-of.html

+0

"मैन्युअल में" शर्तों के लिए नहीं "पूरी तरह से सही नहीं है, यह होना चाहिए" नहीं यदि 'स्कोप' परिभाषित किया गया है "। – 244an

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

  • कोई संबंधित समस्या नहीं^_^