سؤال

بالنظر إلى ثلاثة نماذج متداخلة في بعضها البعض. إذا قمت بإنشاء كائن المستوى الأعلى و 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 لا يعرف حقًا من هو والدها في وقت الخلق.

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