لا تعود علاقة ActivereCord has_one في بعض الحالات
-
22-09-2019 - |
سؤال
بالنظر إلى ثلاثة نماذج متداخلة في بعضها البعض. إذا قمت بإنشاء كائن المستوى الأعلى و Build_* الكائنات الطفل الأخرى ، فيمكنني استرداد جميع الأشياء الفرعية من خلال العلاقات قبل وبعد حفظ () على المثيل الأصلي. ومع ذلك ، إذا حاولت استرداد المستوى الثاني كائن متداخل بعد العثور على (: id) الوالد الأصلي الذي يفشل. يمكنني استرداد الكائن المتداخل من المستوى الأول. يحدث هذا عادة في وحدة تحكم ، لكنني سأوضحه في إخراج وحدة التحكم أدناه.
ما الذي أطلبه؟
شكرا لك مقدما!
~ JPV
>> l = Lead.new :buyer_name => 'Kim Possible', :email => 'kim@possible.com', :phone => '7131231234' >> l.build_buyer >> l.buyer.name = 'kim buyer' >> l.buyer >> l.buyer.build_contact_detail >> l.buyer.contact_detail.email = "kim-contact-detail@possible.com" >> l.save #returns true >> l.buyer #هذا يعمل => #<Buyer id: 1, name: "kim buyer", lead_id: 1> >> l.buyer.contact_detail #هذا يعمل => #<ContactDetail id: 1, company_id: nil, buyer_id: 1, email: nil, address_line_1: nil, address_line_2: nil, city: nil, state: nil, postal_code: nil> >> l2 = Lead.find(1) => #<Lead id: 1, company_id: nil, buyer_id: nil, public_lead_id: nil, buyer_name: "Kim Possible", company_name: nil, email: "kim@possible.com", phone: "7131231234"> >> l2.buyer #هذا يعمل كما هو متوقع => #<Buyer id: 1, name: "kim buyer", lead_id: 1> >> l2.buyer.contact_detail #هذا يكسر => nil
جميع الأشياء المليئة بالملل أدناه:
class Lead has_one :buyer #... end class Buyer has_one :contact_detail belongs_to :lead #... end class ContactDetail belongs_to :buyer #... end
المفاتيح الأجنبية المناسبة موجودة في كل من فئات "الانتماء _ TO".
class CreateBuyers < ActiveRecord::Migration def self.up create_table :buyers do |t| t.string :name t.integer :lead_id ... class CreateContactDetails < ActiveRecord::Migration def self.up create_table :contact_details do |t| t.integer :buyer_id
المحلول
أعتقد أنك قد تتعثر لأنك تتوقع أن يحرص كائن تحميل كائنات الأطفال المتداخلة. بشكل عام ، يجب عليك تحديد ذلك بشكل صريح حتى يحدث ذلك في الاكتشاف. حاول إضافة: include => [: المقترض ، {: Borrower =>: contact_detail}] إلى خيارات البحث ومعرفة ما إذا كان ذلك يعمل.
نصائح أخرى
هل هذا العمل إذا فعلت ...
l.buyer.name = 'kim buyer'
l.save
l.buyer.build_contact_detail
...
إذا كان الأمر كذلك ، فقد يكون هذا خطأً في القضبان مع كائن ContactDetail لا يعرف حقًا من هو والدها في وقت الخلق.