我有一个模型,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并在事务中包装它们。但是如果可能的话,我真的希望将这个逻辑保留在模型中。似乎几乎可能。有没有人有任何建议?
答案 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
这有意义吗?