2012-06-06 2 views
3

У меня есть after_commit setup как folllows.after_commit не получил вызов

class MyModel < ActiveRecord::Base 
    after_commit { Rails.logger.info ("commit here") } 

    # ... 
end 

Я тогда оберточной update_all, который не срабатывает обратный вызов, внутри транзакции, которая должна сгореть обратного вызова.

Почему не запущен after_commit? Я не вижу «commit here» в моих журналах. Он отлично подходит для уничтожения.

ответ

6

Способ работы after_commit заключается в том, что всякий раз, когда запись сохраняется, она добавляется в список записей. Когда транзакция завершается, рельсы повторяются через этот список, вызывающий после каждого из них фиксации.

Когда вы делаете update_all, экземпляры не сохраняются индивидуально (поскольку они фактически не загружены вообще - рельсы на самом деле не знают, какие строки были обновлены), и поэтому они не добавляются в список, after_commit.

destroy_all отличается тем, что на самом деле загружает все экземпляры и удаляет их один за другим, запуская все обратные вызовы. Аналогичное поведение вы бы установили: update_all, если вы использовали delete_all

+2

Ну, это прискорбно. Вы думаете, что after_commit будет стрелять * после *, он сделал * COMMIT *. Благодарю. –

+0

@FrederickCheung Я не знаю, если это так больше, я вызывал 'destroy_all' из консоли, обратный вызов' after_commit' вообще не срабатывает. даже если вызов был сделан индивидуально на каждом объекте модели – Minato

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