ActiveRecord автосохранение: ложь не работает - PullRequest
3 голосов
/ 21 июня 2011

Согласно документам , установка :autosave => false для ассоциации НЕ должна сохранять эти ассоциации при сохранении родителя.Это не работает для меня.Я только что создал ванильное приложение 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 ]

5 голосов
/ 13 сентября 2011

Это не ошибка, вместо этого она предназначена. см http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Подтверждением этого также является нажатие на метод Source: show метода acceptpts_nested_attributes_for.

Обратите внимание, что опция: автосохранение включается автоматически на каждом ассоциация, для которой принято accept_nested_attributes_for.

0 голосов
/ 09 января 2014

Добавление ответа Innerpeacer не имеет смысла устанавливать атрибут autosave в false, если вы используете acceptpts_nested_attributes_for.Одной из причин использования acceptpts_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'})]
...