问题 在保存记录之前创建关联


所以,我当然是一个Rails新手,我遇到了一个相当普遍的问题,但我找不到答案。

我有一个模特 Foo 喜欢这个:

class Foo < ActiveRecord::Base
  has_many :bars
end

酒吧belongs_to Foo,一切正常。现在我想创建一个Foo并同时构建Bar。喜欢这个:

f = Foo.new(:baz => 'baz')
bars.each do |b|
  f.bars.build(:bizzy => b[:bizzy])
end
f.save

我知道这不起作用,因为父记录不存在,所以关联不存在,但必须有一种方法来做到这一点。我暂时通过编辑来解决这个问题:

f = Foo.new(:baz => 'baz')
f.save
f = Foo.find(:first, :conditions => {:baz => 'baz'})
bars.each do |b|
  f.bars.create(:bizzy => b[:bizzy])
end

但那并不干净,而且一切都令人不快。

这样做的正确方法是什么?


3098
2018-04-10 13:19


起源



答案:


在第一行你可以使用 create 代替 new。你不需要 f.bars.create 要么 f.bars.build,因为 bar 对象已经存在。我会这样做:

f = Foo.create(:baz => 'baz')

bars.each do |b|
  f.bars << b
end

我个人不会迭代 bars,但只是使用 update_all

f = Foo.create(:baz => 'baz')
bars.update_all(:foo_id => f.id)

编辑:可以在不保存记录的情况下执行此操作。这对我有用:

f = Foo.new(:baz => 'baz')

bars.each do |b|
  f.bars << b
end

f.save

10
2018-04-10 13:32



嗯,我可以发誓那是不可能的。你是对的,在我再次测试之后,它就像一个魅力。谢谢! - Eugene
进入相同的问题,并意识到,对于最后一个选项(f = Foo.new),我不得不删除 :foo_id, remove :presence => true 在Bar模型上(在我自己的代码中)。 - migu


答案:


在第一行你可以使用 create 代替 new。你不需要 f.bars.create 要么 f.bars.build,因为 bar 对象已经存在。我会这样做:

f = Foo.create(:baz => 'baz')

bars.each do |b|
  f.bars << b
end

我个人不会迭代 bars,但只是使用 update_all

f = Foo.create(:baz => 'baz')
bars.update_all(:foo_id => f.id)

编辑:可以在不保存记录的情况下执行此操作。这对我有用:

f = Foo.new(:baz => 'baz')

bars.each do |b|
  f.bars << b
end

f.save

10
2018-04-10 13:32



嗯,我可以发誓那是不可能的。你是对的,在我再次测试之后,它就像一个魅力。谢谢! - Eugene
进入相同的问题,并意识到,对于最后一个选项(f = Foo.new),我不得不删除 :foo_id, remove :presence => true 在Bar模型上(在我自己的代码中)。 - migu