0

给定三个相互嵌套的模型。如果我创建顶级对象并 build_* 其他子对象,我可以通过原始实例上的 save() 之前和之后的关系检索所有子对象。但是,如果我尝试在 find(:id) 原始父对象之后检索第二级嵌套对象,它将失败。但是,我可以检索第一级嵌套对象。这通常发生在控制器中,但我将在下面的控制台输出中说明它。

我在看什么?

提前致谢!
~jpv

>> l = Lead.new :buyer_name => 'Kim Possible', :email => 'kim@possible.com', :phone => '7131231234'
>> l.build_buyer
>> l.buyer.name = '金买家'
>> l.买家
>> l.buyer.build_contact_detail
>> l.buyer.contact_detail.email = "kim-contact-detail@possible.com"
>> l.save #returns true
>> l.buyer #这个作品
=> #<买家id:1,名称:“kim买家”,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”,公司名称:nil,电子邮件:“kim@possible.com”,电话:“7131231234”>
>> l2.buyer #按预期工作
=> #<买家id:1,名称:“kim买家”,lead_id:1>
>> l2.buyer.contact_detail #此中断
=> 无

下面的所有样板文件:

班主任
  has_one :买家
  #...
结尾

类采购员
  has_one :contact_detail
  属于_to :lead
  #...
结尾

班级联系方式
  属于_to :买家
  #...
结尾

适当的外键位于每个“belongs_to”类中。

类 CreateBuyers < ActiveRecord::Migration
  def self.up
    create_table :买家做|t|
      t.string:名称
      t.integer :lead_id
...

类 CreateContactDetails < ActiveRecord::Migration
  def self.up
    create_table :contact_details 做 |t|
      t.integer :buyer_id
4

2 回答 2

1

我认为您可能会被绊倒,因为您期望对象急切加载嵌套的子对象。通常,您必须明确指定它才能在查找中发生。尝试将 :include => [:borrower, {:borrower => :contact_detail}] 添加到查找的选项中,看看是否有效。

于 2010-01-04T02:34:09.313 回答
0

如果你这样做,这是否有效...

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

如果是这样,这可能是一个 Rails 错误,ContactDetail 对象在创建时并不真正知道它的父亲是谁。

于 2009-12-31T19:01:20.507 回答