2013-11-21 5 views
0

У нас есть две модели - ModelA и ModelB. Когда мы создаем/сохраняем экземпляр ModelA, нам нужны объемные вставки для ModelB (требуется идентификатор ModelA, отсутствие связи между ModelA и ModelB). Мы делаем это, запустив фоновое задание в обратном вызове after_save ModelA.Это активные обратные вызовы - after_save и after_commit являются потокобезопасными?

Проблема в том, что объемные вставки для ModelB неверны, поскольку ModelA не сохраняется навсегда в базе данных. Поэтому мы решили использовать after_commit. Но мы также нуждаемся в состоянии экземпляра (который находится в after_save) ModelA. Мы присваиваем это состояние одной переменной в after_save и получаем ее через after_commit.

Активные записи after_Save и after_commit обратные вызовы являются потокобезопасными в текущем экземпляре ModelA?

ответ

0

Я предполагаю, что ваши ассоциации:

ModelA has_many :modelBs 
ModelB belongs_to :modelA 

Вместо запуска сохранения для MODELA затем запустить сейвы для modelb вы должны сделать все это в одной транзакции, рельсы делает большинство из этого для вас.

@modelA = ModelA.new(params[:modelA]) 

@modelA.modelBs.new(params[:modelB].values) 

@modelA.save 

это, конечно, если вы будете следовать рельсам параметры конвенций

<form action=(modela_url) post> 
<input name='modelA[`attr`]' ... 
<input name='modelA[`attr`]' ... 

<!-- multiple sub model objects 
<input name='modelB[1][`attr`]' ... 
<input name='modelB[2][`attr`]' ... 
+0

Спасибо за ваш ответ. Есть одно недоразумение. Я обновил вопрос. При вставке записей для ModelB я хочу идентификатор экземпляра ModelA, и между ModelA и ModelB нет никакой связи. Мы запускаем одно фоновое обслуживание для массовых вставок. – SR5

Смежные вопросы