Связь ActiveRecord с has_one не возвращается в определенных случаях

StackOverflow https://stackoverflow.com/questions/1983105

Вопрос

Даны три модели, каждая из которых вложена друг в друга.Если я создам объект верхнего уровня и создам_* другие дочерние объекты, я смогу извлечь все дочерние объекты через отношения до и после save() в исходном экземпляре.Однако, если я попытаюсь извлечь 2 - й уровень вложенный объект после поиска (:id) исходного родительского объекта завершается с ошибкой.Однако я могу извлечь вложенный объект 1-го уровня.Обычно это происходит в контроллере, но я проиллюстрирую это в выводе консоли ниже.

Что я упускаю из виду?

Заранее спасибо!
~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

Соответствующие внешние ключи находятся в каждом из классов "belongs_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
Это было полезно?

Решение

Я думаю, что вы, возможно, сбиваетесь с толку, потому что ожидаете, что объект будет охотно загружать вложенные дочерние объекты.В общем, вы должны явно указать это, чтобы это произошло в find .Попробуйте добавить :включить => [:заемщик, {:заемщик => :contact_detail}] к параметрам поиска и посмотрите, работает ли это.

Другие советы

Сработает ли это, если вы это сделаете...

l.buyer.name = 'kim buyer'
l.save
l.buyer.build_contact_detail
...

Если это так, то это может быть ошибка rails, когда объект ContactDetail на самом деле не знает, кто является его папкой во время создания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top