ruby-on-rails - معنى - ruby on rails شرح




لماذا يستخدم Rails 5 ApplicationRecord بدلاً من ActiveRecord:: Base؟ (2)

نعلم أن Rails 5 أضاف ApplicationRecord كفئة تجريدية تم توريثها بواسطة عارضتنا (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 ؟


في حين أنه قد يبدو نفسه في تطبيقات القضبان الأساسية ، إلا أنه يوجد فرق مهم بمجرد بدء استخدام محركات القضبان ، والمكونات الإضافية / الأحجار الكريمة أو الطرق المباشرة من ActiveRecord::Base .

  • ActiveRecord::Base.include(MyFeatures) في الميزات مباشرة في ActiveRecord::Base وهو موجود إلى الأبد لجميع الاستخدامات المتأخرة لـ ActiveRecord::Base (لا يمكن أن يكون "unmixed") ولا توجد طريقة للحصول على الأصلي ActiveRecord::Base بعد الآن في أي رمز بعد التضمين. يمكن أن يؤدي ذلك بسهولة إلى حدوث مشكلات إذا قام بعض الممزوج في الميزة بتغيير سلوك ActiveRecord الافتراضي أو إذا حاول محركان / gems على سبيل المثال تضمين أساليب مسماة بنفس الاسم.

  • من ناحية أخرى ، يجعل منهج ApplicationRecord المميزات الموجودة فقط للفئات (النماذج) التي ترثها ، والفصول الأخرى ، بالإضافة إلى الاستخدام المباشر لـ ActiveRecord::Base يبقى البكر ، مرتبطا بميزات الوحدة.

هذا مهم بشكل خاص عند استخدام المكونات الإضافية للمحركات أو القضبان لأنها تسمح لهم بفصل منطق النموذج الخاص بهم عن منطق نموذج التطبيق الرئيسي الذي لم يكن ممكنًا قبل ApplicationRecord .

كل هذا تم وصفه جيدًا أيضًا في مشاركة المدوّنة وتعليق github هذا .


هذا للتوسع على الإجابة @ BoraMa ، ونأمل ، توضيح بعض الارتباك حول 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 لجعل هذا العمل.

لقد فعلت الشيء نفسه في مشروع Rails 4.2.6 لأن النماذج استخدمت UUID للمعرفات بدلاً من الأعداد الصحيحة ، وهذا تطلب تغييرًا في ORDER BY الافتراضي. لذلك ، بدلاً من استخدام النسخ واللصق أو القلق ، ذهبت بالوراثة باستخدام فئة self.abstract_class = true و self.abstract_class = true .





ruby-on-rails-5