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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top