القضبان: احفظ سجلًا عبر الانتماء _TO ووضع المفتاح الأجنبي
-
21-09-2019 - |
سؤال
هل هناك طريقة أفضل لكتابة هذا الرمز؟ إنه لا يجلس معي بشكل صحيح ، أشعر أن هناك شيئًا ما مثل "قضبان مثل" التي يجب أن أعرفها بالفعل:
belongs_to :parent_in_use
belongs_to :parent_template
def after_create
new_parent_in_use = ParentInUse.create!(self.parent_template.attributes)
self.update_attribute(:parent_in_use_id, new_parent_in_use.id)
end
بعد إنشاء سجل ، آخذ القالب الأصل المحدد وإنشاء ملف parent_in_use
سجل بناءً عليه. وبهذه الطريقة ، يمكن أن يتغير القالب وسيعيش سجل IN_USE مع كائني إلى الأبد. ترث كل من فئات ParentInuse و ParentTemplate من الوالد باستخدام STI.
أنا متأكد من أن هذا يجب أن يكون بسيطًا بما فيه الكفاية ، لكنني لا أعرف كيفية القيام بذلك ، وأود أن أقوم بإنشاء السجل وتعيين السجل في عملية واحدة.
المحلول
هذا سيفعل ما تبحث عنه.
def after_create
self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end
ولكن بدون تغييرات أخرى ، لن تفعل أي شيء جيد. نظرًا لأن المفتاح الخارجي يتم تخزينه في النموذج الحالي ، فلن يحفظ ActivereCord التغيير إذا تم إنشاء هذا الارتباط عن طريق مكالمة After_create مرة أخرى. سيتم حفظ كائن ParentInuse الجديد ، ولكن لن يتم تحديث صف قاعدة البيانات للنموذج الحالي باستخدام هذا Parent_IN_US_ID المقابل.
نسميها كمكالمة قبل _create مرة أخرى وسوف تسير الأمور بسلاسة أكثر.