2013-03-06 5 views

उत्तर

32

एक साधारण संबंध में, दो मॉडल केवल एक ही तरीके से संबंधित हो सकते हैं, और संबंध का नाम स्वचालित रूप से उस मॉडल का नाम होता है जो उससे संबंधित है। यह ज्यादातर मामलों में ठीक है, लेकिन हमेशा पर्याप्त नहीं है।

inverse_of आपको उस संबंध को निर्दिष्ट करने की अनुमति देता है जिसका आप उल्लेख कर रहे हैं। यह उन मामलों में सहायक है जहां आप अपने संबंधों के लिए कस्टम नामों का उपयोग करना चाहते हैं। उदाहरण के लिए:

class User 
    include Mongoid::Document 
    has_many :requests, class_name: "Request", inverse_of: :requester 
    has_many :assignments, class_name: "Request", inverse_of: :worker 
end 

class Request 
    include Mongoid::Document 
    belongs_to :requester, class_name: "User", inverse_of: :requests 
    belongs_to :worker, class_name: "User", inverse_of: :assignments 
end 

इस उदाहरण में, उपयोगकर्ता अनुरोध कर सकते हैं और टिकटों को सौंपा जा सकता है। इन दो अलग-अलग रिश्तों का प्रतिनिधित्व करने के लिए, हमें दो संबंधों को एक ही मॉडल में परिभाषित करने की आवश्यकता है लेकिन विभिन्न नामों के साथ। inverse_of का उपयोग करने से मोंगोइड को पता चलता है कि "अनुरोधकर्ता" के साथ "अनुरोध" जाता है और "असाइनमेंट" "कार्यकर्ता" के साथ जाता है। यहां लाभ दो गुना है, हम अपने संबंध के लिए सार्थक नामों का उपयोग करते हैं, और हमारे पास कई तरीकों से दो मॉडल संबंधित हो सकते हैं। अधिक विस्तृत जानकारी के लिए Mongoid Relations दस्तावेज़ीकरण देखें।

+2

इसलिए कस्टम नाम के साथ केवल एक संबंध होने पर मुझे '' '' '' '' '' '' 'की आवश्यकता नहीं है, लेकिन मुझे कस्टम नामों के साथ दो संबंधों की आवश्यकता है? अब मैं ActiveRecord '' 'inverse_of''' में अलग-अलग काम करता हूं। – freemanoid

+2

हां, कस्टम नाम के साथ एक ही संबंध के लिए, आपको केवल 'class_name' (सक्रिय रिकॉर्ड और मोंगोइड दोनों में) का उपयोग करने की आवश्यकता है। यदि 'उपयोगकर्ता' और 'अनुरोध' एक से अधिक तरीकों से संबंधित हैं, तो 'inverse_of' एकमात्र तरीका है जो मोंगोइड (और सक्रिय रिकॉर्ड) जानता है कि आप किसका संदर्भ दे रहे हैं। – XanderStrike

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