Устанавливают ли устройства срабатывающие обратные вызовы модели?

Скажем, у меня есть модель User со следующим кодом в User.rb:

before_create :create_dependencies
after_create :build_inbox

И у меня также есть файл users.yml с набором определенных в нем пользовательских устройств.

Когда я запускаю rake db: fixtures: load, он, похоже, не вызывает обратные вызовы.

  • Как это работает? Если да, то почему они спроектировали его таким образом?
  • Есть ли способ принудительно инициировать обратные вызовы при загрузке светильников?

Ответы

Ответ 1

Как это работает? Если так почему они спроектировали его таким образом?

Да, приборы не используют обратные вызовы. Я предполагаю, что это по соображениям производительности. Быстрее загружать данные прямо в базу данных без создания экземпляра модели.

Есть ли способ заставить запускать обратных вызовов при загрузке светильники?

Не то, чтобы я знал. У вас есть пара вариантов. Один из них заключается в том, чтобы строить ваши светильники так, как если бы вызывающие вызовы уже срабатывали. То есть вручную создайте данные, которые будут иметь обратные вызовы. Например, если у вас есть обратный вызов, который хеширует пароль пользователя, вам нужно будет хэш-пароль вручную, а затем сохранить этот хэш в приборе.

Второе решение (и настоятельно рекомендуется!) - использовать фабрики. Заводы активируют обратные вызовы и позволяют использовать виртуальные атрибуты и т.д. Это происходит потому, что они каждый раз создают экземпляр модели. Один популярный камень Factory Девушка. Еще одна попытка - Machinist. Я также создал эпизод Railscasts в теме.

Ответ 2

У меня тоже есть эта проблема. Наше приложение вычисляет некоторые итоги before_save, поэтому его не нужно делать "на лету". Делает отчет быстрее и сокращает несколько подключений к определенным отчетам.

В тестах для этих объектов мы вручную запускаем обратные вызовы следующим образом:

before do
  order.perform_callbacks
end

Это хорошо работает, потому что оно не работает постоянно, поэтому другие тесты не страдают.

Мы используем minitest и крепления btw.