रेल 5.0 और महान के प्रलेखन से।
Guide
द्वि-दिशात्मक संघों
संघों दो अलग अलग मॉडल पर दो दिशाओं में काम करने के लिए, घोषणा की आवश्यकता होती है सामान्य है:
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author
end
डिफ़ॉल्ट रूप से, सक्रिय रिकॉर्ड नहीं करता है ' इन एसोसिएशन के बीच कनेक्शन के बारे में नहीं पता।
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => false
यह इसलिए होता है क्योंकि एक और b.author दो अलग-अलग में स्मृति एक ही डेटा का निरूपण कर रहे हैं, और न ही एक स्वचालित रूप से करने के लिए परिवर्तन से ताज़ा किया जाता है: यह एक वस्तु की दो प्रतियां सिंक्रनाइज़ेशन से बाहर हो रही करने के लिए नेतृत्व कर सकते हैं अन्य। inverse_of विकल्प ताकि आप इन संबंधों की यह सूचित कर सकते हैं:: सक्रिय रिकॉर्ड प्रदान करता है
class Author < ApplicationRecord
has_many :books, inverse_of: :author
end
class Book < ApplicationRecord
belongs_to :author, inverse_of: :books
end
इन परिवर्तनों के साथ
, सक्रिय रिकॉर्ड केवल लेखक वस्तु की एक प्रति लोड होगा, विसंगतियों को रोकने और अपने आवेदन और अधिक कार्यकुशल बनाने:
वे साथ काम नहीं करते: संघों के माध्यम से
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => true
समर्थन inverse_of लिए कुछ सीमाएं हैं। वे पॉलिमॉर्फिक संघों के साथ काम नहीं करते हैं। वे साथ काम नहीं करते: एसोसिएशन के रूप में।
एसोसिएशन के लिए संबंधित है, has_many व्यस्त संघों को नजरअंदाज कर दिया गया है। प्रत्येक एसोसिएशन स्वचालित रूप से व्यस्त एसोसिएशन को खोजने का प्रयास करेगा और इसे सेट करेगा: inverse_of विकल्प heuristically (एसोसिएशन नाम के आधार पर)। मानक नाम वाले अधिकांश संगठनों का समर्थन किया जाएगा।हालांकि, संघों कि इन विकल्पों को शामिल उनके प्रतिलोम स्वचालित रूप से सेट नहीं किया है:
- : स्थिति
- : बहुरूपी
- :
- के माध्यम से foreign_key
क्या आप दस्तावेज़ीकरण में टिप्पणी को समझते हैं: "संबंधित_तो संघों के लिए__nyany व्यस्त संघों को अनदेखा किया जाता है।" और फिर भी डॉक्टर उस सटीक उदाहरण का उपयोग करता है। मुझे यहां क्या समझ नहीं आ रहा है? – dynex
मुझे पूरी तरह से यकीन नहीं है। 'inverse_of' में वास्तव में बहुत अधिक उपयोग नहीं देखा गया है, इसलिए यह एक ऐसा व्यवहार हो सकता है जो बहुत अच्छी तरह परिभाषित नहीं है। मैंने उस सुविधा को इंगित करने के बाद इसका उपयोग करने की कोशिश की है और उसने वास्तव में मेरे लिए कुछ भी उपयोगी नहीं किया है। – tadman
यह मेरे लिए बहुत अजीब बात है, क्योंकि ऐसा लगता है कि आप हमेशा इस व्यवहार को डिफ़ॉल्ट रूप से चाहते हैं, और केवल उपयोग करने की आवश्यकता है: inverse_of जब एसोसिएशन नाम अनुमानित नहीं किया जा सकता है। परिभाषा में असंगतता भी परेशान हैं, लेकिन इससे कुछ मामलों में मुझे मदद मिली है। किसी भी कारण से मुझे इसे हर जगह छूना नहीं चाहिए? – Ibrahim