O relacionamento activerecord tem_one não retorna em certos casos
-
22-09-2019 - |
Pergunta
Dados três modelos que estão aninhados um no outro. Se eu criar o objeto de nível superior e construir_* os outros objetos infantis, posso recuperar todos os objetos infantis através dos relacionamentos antes e depois do salvamento () na instância original. No entanto, se eu tentar recuperar o 2º nível Objeto aninhado após encontrar (: id) o pai original que falha. Eu posso recuperar o objeto aninhado do 1º nível, no entanto. Isso geralmente acontece em um controlador, mas vou ilustrá -lo na saída do console abaixo.
O que estou ignorando?
Desde já, obrigado!
~ 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 #ISSO FUNCIONA => #<Buyer id: 1, name: "kim buyer", lead_id: 1> >> l.buyer.contact_detail #ISSO FUNCIONA => #<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 #Isso funciona como esperado => #<Buyer id: 1, name: "kim buyer", lead_id: 1> >> l2.buyer.contact_detail #Isso quebra => nil
Todas as coisas de caldeira abaixo:
class Lead has_one :buyer #... end class Buyer has_one :contact_detail belongs_to :lead #... end class ContactDetail belongs_to :buyer #... end
As chaves estrangeiras apropriadas estão em cada uma das classes "pertencem_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
Solução
Eu acho que você pode estar sendo tropeçado porque espera que o objeto anseia por objetos infantis aninhados. Em geral, você deve especificá -lo explicitamente para que isso aconteça na descoberta. Tente adicionar: incluir => [: mutuário, {: mutuário =>: contact_detail}] para as opções para descobrir e ver se isso funciona.
Outras dicas
Isso funciona se você faz ...
l.buyer.name = 'kim buyer'
l.save
l.buyer.build_contact_detail
...
Nesse caso, esse pode ser um bug do Rails com o objeto ContactDetail, não sabendo realmente quem é o seu pai no momento da criação.