skip_callback
и set_callback
НЕ являются потокобезопасными. Я смог это подтвердить, пытаясь создать некоторые записи в sidekiq (многопоточный асинхронный процессор заданий). Как только я снова включаю обратные вызовы, возникает состояние гонки, которое приводит к вызову обратных вызовов. Если я прокомментирую код повторной активации обратного вызова, проблем не будет.
Я нашел несколько возможных решений этой проблемы, включая два драгоценных камня:
- драгоценный камень 'sneaky-save'
- камень 'skip_activerecord_callbacks'
Драгоценный камень подлого спасения, кажется, самый прямой и раскрывающий намерения вариант здесь. Драгоценный камень по существу обходит методы постоянства ActiveRecord и выполняет прямой sql.
Это также единственный, который я могу с уверенностью сказать, является потокобезопасным. Это также очень маленький и понятный камень. Недостатком является то, что он не вызывает проверки. Таким образом, вы должны будете сами вызывать проверки.
Ананд А. Бейт собрал большое количество вариантов. Я скептически отношусь к тому, что все пять вариантов безопасны. Два драгоценных камня, упомянутых выше, перечислены вместе с другими возможными вариантами в сообщении Ананда здесь: http://www.allerin.com/blog/save-an-object-skipping-callbacks-in-rails-3-application/