Ruby on rails 如何在父对象具有id之前建立ActiveRecord关联?
我有一个模特,富,有很多酒吧。它有一个虚拟属性current_baz,返回关联中最新条的baz属性(如果存在)。我想定义Foo.current_baz=以便可以说my_Foo.update_属性(:current_baz=>7),特别是,我希望它在创建新的Foo时起作用。我可以这么说Ruby on rails 如何在父对象具有id之前建立ActiveRecord关联?,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我有一个模特,富,有很多酒吧。它有一个虚拟属性current_baz,返回关联中最新条的baz属性(如果存在)。我想定义Foo.current_baz=以便可以说my_Foo.update_属性(:current_baz=>7),特别是,我希望它在创建新的Foo时起作用。我可以这么说 Foo.new(:current_baz => 7, ...) 它应该这样做 self.bars.build(:baz => 7) 当然,它不起作用,因为新的Foo还没有id,因此新的条无效。我知道
Foo.new(:current_baz => 7, ...)
它应该这样做
self.bars.build(:baz => 7)
当然,它不起作用,因为新的Foo还没有id,因此新的条无效。我知道如何在控制器中解决这个问题,首先创建Foo,然后创建Bar,并在事务中包装这两者。但如果可能的话,我真的想在模型中保留这个逻辑。这似乎几乎是可能的。有人有什么建议吗?有几种方法可以做到这一点,但我在过去做过的一种方法(特别是如果你可以相信一次只有一个新的bar对象的话)是在foo中为未保存的bar创建一个实例变量。因此,为了勾勒出这一点,你可以说:
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时,您需要测试新_条的存在性,如下所示:
if @new_bar
return @new_bar.baz
else
return self.bars.last.baz
end
这有意义吗?有几种方法可以做到这一点,但我在过去做过的一种方法(特别是如果你可以相信一次只有一个新的bar对象的话)是在foo中为未保存的bar创建一个实例变量。因此,为了勾勒出这一点,你可以说:
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时,您需要测试新_条的存在性,如下所示:
if @new_bar
return @new_bar.baz
else
return self.bars.last.baz
end
这有意义吗