Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在父对象具有id之前建立ActiveRecord关联?_Ruby On Rails_Activerecord_Associations - Fatal编程技术网

Ruby on rails 如何在父对象具有id之前建立ActiveRecord关联?

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,因此新的条无效。我知道

我有一个模特,富,有很多酒吧。它有一个虚拟属性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,然后创建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
这有意义吗