ActiveRecord自动保存:false似乎不起作用

时间:2011-06-20 20:56:23

标签: ruby-on-rails activerecord autosave

根据docs,在关联时设置:autosave => false不应在保存父级时保存这些关联。这对我来说似乎不起作用。我刚刚创建了一个vanilla Rails 3.0.8应用程序,这就是我得到的:

class Foo < ActiveRecord::Base
  has_many :bars, :autosave => false
  accepts_nested_attributes_for :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

f = Foo.new :name => 'blah', :bars_attributes => [{:name => 'lah'},{:name => 'lkjd'}]
f.save
f.bars
 => [#<Bar id: 1, name: "lah", foo_id: 1, created_at: "2011-06-20 20:51:02", updated_at: "2011-06-20 20:51:02">, #<Bar id: 2, name: "lkjd", foo_id: 1, created_at: "2011-06-20 20:51:02", updated_at: "2011-06-20 20:51:02">]

什么?为什么要保存bars

我觉得我正在服用疯狂的药!我错过了什么?

更新:似乎accepts_nested_attributes_for会自动保存子项,即使它们不是使用嵌套属性功能构建的。它认为这是一个错误。

2 个答案:

答案 0 :(得分:5)

这不是错误,而是意图。见http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

单击方法accepts_nested_attributes_for上的“Source:sh​​ow”也可以证明这一点。

  

请注意:自动启用自动保存选项   accepted_nested_attributes_for的关联用于。

答案 1 :(得分:0)

添加到Innerpeacer响应,如果使用accepts_nested_attributes_for,则将autosave属性设置为false是没有意义的。 使用accepts_nested_attributes_for的原因之一是同时保存子项和父项。

你能做的是:

f = Foo.new :name => 'blah'
f.save
f.bars_attributes = [{:name => 'lah'},{:name => 'lkjd'}]

f = Foo.new :name => 'blah'
f.save
f.bars = [Bars.new({:name => 'lah'}), Bars.new({:name => 'lkjd'})]