Связь ActiveRecord с has_one не возвращается в определенных случаях
-
22-09-2019 - |
Вопрос
Даны три модели, каждая из которых вложена друг в друга.Если я создам объект верхнего уровня и создам_* другие дочерние объекты, я смогу извлечь все дочерние объекты через отношения до и после 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 на самом деле не знает, кто является его папкой во время создания.