如何在父对象具有id之前构建ActiveRecord关联?

时间:2010-07-30 19:44:29

标签: ruby-on-rails activerecord associations

我有一个模型,Foo,has_many Bars。它有一个虚拟属性current_baz,它返回关联中最新Bar的baz属性(如果存在)。我想定义Foo.current_baz =以便可以说my_foo.update_attributes(:current_baz => 7),特别是,我希望它在创建新的Foo时起作用。这样我可以说

Foo.new(:current_baz => 7, ...)

它应该

self.bars.build(:baz => 7)

当然,它不起作用,因为新的Foo还没有id,因此新的Bar无效。我知道如何在控制器中解决这个问题,首先创建Foo然后创建Bar并在事务中包装它们。但是如果可能的话,我真的希望将这个逻辑保留在模型中。似乎几乎可能。有没有人有任何建议?

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,但我过去做过的一种方式(特别是如果你可以依赖一次只有一个新的条形对象,那就是为未保存的条形成一个实例变量在foo里面。那么,为了勾勒出来,你会说:

if self.new?
  @new_bar = bar.new
  @new_bar.baz = new_current_baz_value
else
  self.bars.build(:baz => 7)
end

然后,添加一个说

的after_save处理程序
if @new_bar
  @new_bar.foo = self
  @new_bar.save
  @new_bar = nil
end

然后,最后,当你调用current_baz时,你需要测试new_bar的存在,如下所示:

if @new_bar
  return @new_bar.baz
else
  return self.bars.last.baz
end

这有意义吗?