سؤال

النموذج الخاص بي ، "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

على الأرجح "المالك" جزء من نموذج قاعدة البيانات الخاص بك. يتم إنشاء ملحقات لحقول قاعدة البيانات تلقائيًا لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top