Pregunta

Dado tres modelos que están cada anidados uno en el otro. Si creo el objeto de nivel superior y build_ * los otros objetos secundarios, puedo recuperar todos los objetos secundarios a través de las relaciones antes y después Save () en la instancia original. Sin embargo, si intento para recuperar el segundo nivel objeto anidado después de find (: id) el padre original, se produce un error. Puedo recuperar el 1er nivel anidado objeto, sin embargo. Esto sucede generalmente en un controlador, pero voy a ilustrar en salida de la consola a continuación.

Lo que estoy pasando por alto?

Gracias de antemano!
~ 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 #THIS WORKS
=> #<Buyer id: 1, name: "kim buyer", lead_id: 1>
>> l.buyer.contact_detail #THIS WORKS
=> #<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 #THIS WORKS AS EXPECTED
=> #<Buyer id: 1, name: "kim buyer", lead_id: 1>
>> l2.buyer.contact_detail #THIS BREAKS
=> nil

Todo el material reutilizable a continuación:

class Lead
  has_one :buyer
  #...
end

class Buyer
  has_one :contact_detail
  belongs_to :lead
  #...
end

class ContactDetail
  belongs_to :buyer
  #...
end

Las claves externas apropiadas están en cada uno de los "belongs_to" clases.

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
¿Fue útil?

Solución

creo que podría estar recibiendo un tropiezo, porque usted está esperando el objeto de carga ansiosa niño anidada objetos. En general, se tiene que especificar explícitamente para que eso ocurra en el hallazgo. Trate de añadir: include => [: prestatario, {: prestatario =>: CONTACT_DETAIL}]. A las opciones para el hallazgo y ver si funciona

Otros consejos

¿Esto funciona si lo hace ...

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

Si es así, esto podría ser un error con los carriles del objeto ContactDetail sin saber que su papá es a la hora de la creación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top