فهم Ruby on Rails ActivereCord Accessors
-
22-09-2019 - |
سؤال
النموذج الخاص بي ، "DataFile" ، يحتوي على مجموعة من الحقول التي أود تعيينها من خارج النموذج ، على سبيل المثال
file = DataFile.new file.owner = 123
الآن ، على حد علمي ، يجب أن أضع "ATTR_ACCESSOR: Field" في طرازتي ، لكل حقل أود تعديله من الخارج. ومع ذلك ، فإن الرمز أعلاه يعمل بشكل جيد دون تحديد أي ATTR_ACCUSS ، قم بتعيين حقل المالك إلى 123. لماذا هذا؟
كنت أتوقع أن أحصل على خطأ "غير محدد" أو شيء من هذا القبيل.
المحلول
نظرًا لأن Rails 'ORM يستخدم نمط ActivereCord ، يتم إنشاء طريقتين تلقائيًا لكل عمود في قاعدة البيانات المرتبطة بهذا الجدول: اسم العمود, ، و ColumnName =. يحدث هذا "تلقائيًا" كنتيجة لراث النموذج الخاص بك من ActivereCord :: Base. يتم تعريف هذه الطرق باستخدام مرافق Metaprogramming من Ruby ويتم إنشاؤها ديناميكيًا في وقت إنشاء الفصل.
لمزيد من المعلومات حول ما يجري بالضبط ، سألقي نظرة على مصدر القضبان. ومع ذلك ، فإن ما سبق ربما يكفي لإعطائك فهمًا عمليًا لما يحدث.
نصائح أخرى
حصلت درو وزيبلوك على ذلك بشكل صحيح ، لكنني سأضيف شيئًا آخر. لا تعد الملحقات التي تنشئها Rails (في الواقع ، ActivereCord) لحقول قاعدة البيانات غير وصول روبي ، وإذا كنت تستخدم البرنامج النصي/وحدة التحكم ، فسترى أن المالك ليس متغيرًا مثيلًا لملف الكائن.
من المحتمل ألا تلاحظ ذلك أبدًا حتى تغامر بعيدًا عن الملحقات القياسية ومحاولة معالجة Onlyer داخل طريقة في الملف. إذا كنت تتعلم روبي في نفس الوقت الذي تتعلم فيه القضبان (وهو ما فعلته) ، فمن المحتمل أن تصطدم بهذا في مرحلة ما. هذا هو السبب في أنك بحاجة إلى الكتابة:
class MyClass < ActiveRecord::Base
def invalidate_owner
self.owner = owner << " no longer owns this"
save
end
end
بدلاً من
class MyClass < ActiveRecord::Base
def invalidate_owner
self.owner << " no longer owns this"
save
end
end
على الأرجح "المالك" جزء من نموذج قاعدة البيانات الخاص بك. يتم إنشاء ملحقات لحقول قاعدة البيانات تلقائيًا لك.