Как отключить обратные вызовы ActiveRecord в Rails 3? - PullRequest
2 голосов
/ 20 декабря 2010

Я хотел бы пропустить / отключить ActiveRecord обратные вызовы, в частности, в Rails 3. Ниже приведен пример решения, о котором я подумал - создание атрибута, который определен для создания объекта без обратных вызовов.

product = Product.new(title: 'Smth')
product.send(:create_without_callbacks)

Приведенный выше пример аналогичен приведенному в этом ответе , но автор сказал, что он предназначен для конкретно Rails 2. Существует ли аналогичный или даже лучший способ сделатьэто для рельсов 3 ?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010
0 голосов
/ 07 октября 2016

SomeModel.skip_callback (: сохранить) сделать; somemodel_instance.save; конец

проверено: Рельсы 4.2.1

0 голосов
/ 13 марта 2015

Вы можете найти решение здесь полезным: http://manuelvanrijn.nl/blog/2012/01/12/disable-rails-before-slash-after-callback/

TL; DR - Если вы делаете эту работу, может быть полезно создать класс (см. Сообщение в блоге)держать ваш код сухим.В противном случае, если вы сделаете это один раз или даже в тестировании (как я), вы можете просто сделать следующее:

SomeModel.skip_callback(:save, :before, :before_action)
SomeModel.skip_callback(:save, :after, :after_action)

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

Это будет работать как в Rails 3, так и в Rails 4. Как отмечено в комментарии, если вам нужно отключить обратные вызовы, вы можете спросить себя , почему вам нужны эти обратные вызовы.Чтобы расширить, отключение обратных вызовов сомнительно только в производстве.Если вам нужно отключить их при тестировании (что я и делаю сам), это приемлемо ... Тем более, что ядро ​​Rails 4 не одобряет использование наблюдателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...