ruby on rails - Is it meaningful to override the '==' method in ActiveRecord subclasses? -
रेल ' ActiveRecord :: Base
वर्ग एक विधि परिभाषित करता है जो true
यदि वस्तुओं समान हैं या उनके पास एक ही आईडी है।
मैंने अपने रेल मॉडल के कुछ और मॉडलों में ==
ओवरराइड किया है ताकि अधिक सार्थक समानता स्थितियों की अनुमति मिल सके। जब मैं ऑब्जेक्ट की सीधे तुलना करता हूं (उदा।, स्क्रिप्ट / कंसोल
के माध्यम से), लेकिन अगर मैं my_array_of_models.include जैसे कुछ करता हूं, तो ये काम करता है? अन्य_मॉडल
, शामिल है?
हमेशा झूठा
देता है। भले ही सरणी में ऐसी कोई वस्तु होती है जो "बराबर" है (मेरी परिभाषा के अनुसार)।
मैंने ऐसा करके तय किया है, उदा।, यहाँ मेरे लागूकरण हैं ओवरराइड तरीके दो वर्ग हैं, my_array_of_models.any? {| एल | El.attr == other_model.attr}
(जो मुझे लगता है कि जिस तरह से आपको तुलना करने के लिए प्रोत्साहित किया जाता है वैसे भी), लेकिन मैं सोच रहा हूं: क्या == ActiveRecord मॉडल में, या ActiveRecord एक उच्च स्तर पर कुछ करता है जो ऐसे ओवरराइड पद्धति को बेकार (या इससे भी बदतर, खतरनाक) प्रदान करता है?
। स्रोत
उपयोगकर्ता
और संपर्क करें
। उपयोगकर्ता
के अद्वितीय ईमेल पते हैं, इसलिए ==
ईमेल पते एक ही हैं, अगर सही देता है संपर्क
उपयोगकर्ता
(सोशल नेटवर्किंग में एक "मित्र" रिश्ते की तरह) के बीच एक पुल है, और अगर उनके पास वही है तो true
वापस कर देना चाहिए > उपयोगकर्ता_आईडी
क्लास उपयोगकर्ता & lt; ActiveRecord :: बेस डीईफ़ == (अन्य) अन्य। उत्तरपत्रित करें? (: ईमेल) और self.email == अन्य.ईमेल एंड एंड क्लास संपर्क & lt; ActiveRecord :: बेस डीईफ़ == (अन्य) अगर अन्य। वर्ग == आत्म। वर्ग स्वयं। यूजर == अन्य। यूसर एल्सफ़ अन्य.kind_of? जैसा कि मैंने नोट किया है, यह प्रत्यक्ष रूप से तुलना करते समय काम करता है (जैसे, one_object == another_object
), लेकिन
कोड> my_array_of_objs.include?
शायद पढ़ने के लिए इसके शिक्षाप्रद प्रलेखन का यह टुकड़ा:
array_of_models.include? (My_object)
शायद काम नहीं करता क्योंकि ==
नहीं है यह परीक्षण करने के लिए प्रयोग किया जाता है कि संग्रह में ऑब्जेक्ट है। यह बराबर?
का उपयोग करता है।
EDIT
ओपी का यह दावा है कि जब भी ओवरड्राइड्स ==
अपने मॉडल के लिए विधि, array.include? (Obj)
रिटर्न गलत झूठ नहीं है यह देखते हैं:
वर्ग की घटना & lt; ActiveRecord :: बेस def == (वह) अगर (that.eventname == self.eventname) सच और गलत अंत अंत एंड & gt; & gt; एक & lt; & lt; Event.find (1) = & gt; [# & Lt; इवेंट आईडी: 1, इवेंटनाम: "हेमंत", फू: निल, बनाया_ट: "2009-06-24 21:33:00", अपडेटेड_ैट: "2009-06-24 21:33:00" & gt; ] & Gt; & gt; B = Event.find (2) = & gt; # & Lt; इवेंट आईडी: 2, इवेंटनाम: "हेमंत", फू: निल, बनाया_ट: "2009-06-24 21:33:04", अपडेटेड_ैट: "2009-06-24 21:33:04" & gt; & Gt; & gt; A.include? (बी) = & gt; सच
स्पष्ट रूप से सच नहीं है। लेकिन वैसे भी, मुझे लगता है कि जब एआर एक विशिष्ट तरीके से ==
को परिभाषित करता है, तो इसे ओवरराइड करने का कोई अच्छा विचार नहीं है। यह बगों को पहचानना कठिन हो सकता है।
Comments
Post a Comment