Приборы запускают обратные вызовы модели? - PullRequest
17 голосов
/ 03 августа 2009

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

before_create :create_dependencies
after_create :build_inbox

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

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

  1. Это то, как это должно работать? Если так, то почему они разработали его таким образом?
  2. Есть ли способ принудительно вызвать обратные вызовы при загрузке приборов?

Ответы [ 2 ]

23 голосов
/ 03 августа 2009

Это то, как это должно работать? Если Итак, почему они спроектировали это так?

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

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

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

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

4 голосов
/ 08 апреля 2015

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

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

before do
  order.perform_callbacks
end

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

Кстати, мы используем минитест и светильники.

...