【问题标题】:ActiveRecord has_one relationship does not return in certain casesActiveRecord has_one 关系在某些情况下不返回
【发布时间】:2010-12-31 06:50:43
【问题描述】:

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

我忽略了什么?

提前致谢!
~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 #这可行 => # >> l.buyer.contact_detail #这可行 => # >> l2 = Lead.find(1) => # >> l2.buyer #按预期工作 => # >> l2.buyer.contact_detail #THIS BREAKS => 无

下面的所有样板文件:

班主任 has_one :买家 #... 结尾 类采购员 has_one :contact_detail 属于_to :lead #... 结尾 班级联系方式 属于_to :买家 #... 结尾

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

类 CreateBuyers

【问题讨论】:

  • 刚刚意识到这条线 >> l.buyer.contact_detail.email = "kim-contact-detail@possible.com" 也不起作用,因为在 save() 之后 Lead.borrower.contact_detail.email 为零。

标签: ruby-on-rails activerecord one-to-one belongs-to has-one


【解决方案1】:

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

【讨论】:

  • 谢谢!那成功了。我猜 Rails 只渴望加载第一级关联。
【解决方案2】:

如果你这样做,这行得通吗...

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

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

【讨论】:

  • 是的,它确实适用于原始对象。但是,当我第二次实例化它时,它会失去关系。我也倾向于 rails bug。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2022-07-01
  • 2012-12-29
  • 2019-12-27
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多