2016-05-21 4 views
27

हम जानते हैं कि रेल 5 ने ApplicationRecord को एक अमूर्त वर्ग के रूप में जोड़ा जो हमारे मॉडल (ActiveRecord) द्वारा विरासत में मिला था।क्यों Rails 5 ActiveRecord :: बेस के बजाय ApplicationRecord का उपयोग करता है?

लेकिन मूल रूप से, मुझे लगता है कि हम एप्लिकेशन रिकॉर्ड्स के साथ हर तकनीकी आवश्यकता के साथ करते हैं, हम ActiveRecord::Base के साथ भी कर सकते हैं। उदाहरण के लिए:

module MyFeatures 
    def do_something 
    puts "Doing something" 
    end 
end 

class ApplicationRecord < ActiveRecord::Base 
    include MyFeatures 
    self.abstract_class = true 
end 

तो अब हर मॉडल MyFeatures के व्यवहार संलग्न की जाएगी। लेकिन हम भी रेल 4 में इस लक्ष्य को हासिल कर सकते हैं:

ActiveRecord::Base.include(MyFeatures) 

तो ApplicationRecord उपयोग करने का लाभ क्या है, आपको लगता है यह ApplicationRecord जोड़ने के लिए आवश्यक है?

उत्तर

35

हालांकि यह मूल रेल अनुप्रयोगों में समान प्रतीत हो सकता है, एक बार जब आप रेल इंजन, प्लगइन्स/रत्न या ActiveRecord::Base से प्रत्यक्ष विधियों का उपयोग करना शुरू करते हैं तो वास्तव में एक महत्वपूर्ण अंतर होता है। सीधे ActiveRecord::Base में सुविधाओं में

  • ActiveRecord::Base.include(MyFeatures) घोला जा सकता है और यह (यह "अमिश्रित" नहीं किया जा सकता) हमेशा के लिए ActiveRecord::Base के सभी बाद में उपयोग के लिए वहाँ मौजूद है और वहाँ के बाद किसी भी कोड में अब और मूल ActiveRecord::Base प्राप्त करने के लिए कोई रास्ता नहीं है शामिल यह आसानी से समस्याओं का कारण बन सकता है यदि मिश्रित सुविधा में से कुछ ने डिफ़ॉल्ट ActiveRecord व्यवहार को बदल दिया है या यदि उदा। दो इंजन/रत्नों ने समान नामित विधियों को शामिल करने का प्रयास किया।

  • दूसरी ओर, ApplicationRecord दृष्टिकोण वर्तमान केवल वर्गों (मॉडल) है कि यह से विरासत, अन्य वर्गों के साथ-साथ ActiveRecord::Base के प्रत्यक्ष उपयोग के लिए सुविधाओं प्राचीन, मॉड्यूल सुविधाओं से सुव्यवस्थित रहने बनाता है।

यह जब इंजन या रेल प्लगइन्स उपयोग किया जाता है क्योंकि यह उन्हें मुख्य आवेदन के मॉडल तर्क जो ApplicationRecord पहले संभव नहीं था से अपने स्वयं के मॉडल तर्क अलग करने के लिए अनुमति देता है विशेष रूप से महत्वपूर्ण है।

यह सब अच्छी तरह से this blog post और this github comment में वर्णित है।

+1

क्या प्रत्येक एकल मणि जो 'ActiveRecord :: Base' को बढ़ाता है, अब इसके परिणामस्वरूप टूटा जाएगा?यदि ऐसा है तो यह रखरखाव और तकनीकी ऋण की एक बड़ी मात्रा में बनाया जा रहा है। – Kelseydh

4

यह @ बोरामा के उत्तर पर विस्तार करना है, और उम्मीद है कि ActiveRecord::Base.abstract_class के आसपास कुछ भ्रम को साफ़ करें।

ActiveRecord::Base.abstract_class कम से कम रेल 3.2.0 (http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Inheritance/ClassMethods.html), जो 20 जनवरी को जारी की गई वापस चला जाता है, 2012

रेल 4.0.0 प्रलेखन सुधार: http://api.rubyonrails.org/v4.0.0/classes/ActiveRecord/Inheritance/ClassMethods.html

तो, हर किसी के लिए है जो सोचता है ApplicationRecord मूल रूप से नया है, यह नहीं है। यह एक सुधार है, ब्रेकिंग बदलाव नहीं। इस काम को करने के लिए ActiveRecord::Base में कुछ भी नहीं जोड़ा गया था।

मैंने रेल 4.2.6 प्रोजेक्ट पर भी यही काम किया क्योंकि मॉडलों ने यूआईआईडीएस को पूर्णांक के बजाय आईडी के लिए इस्तेमाल किया, और इसके लिए डिफ़ॉल्ट ORDER BY में परिवर्तन की आवश्यकता थी। तो, कॉपी-पेस्ट या चिंता का उपयोग करने के बजाय, मैं UuidModel कक्षा और self.abstract_class = true का उपयोग करके विरासत के साथ गया।

+0

मुझे रेल 2.x में 'abstract_class' याद है। – skalee

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