Rails4 Предупреждение об отказе для метода find_or_initialize_by

Я обновляю до Rails4 с 3.2. У меня есть следующий запрос:

progress = Progress.find_or_initialize_by_chore_id_and_period_and_account_id(chore.id, period[chore.frequency], chore.account_id)

При запуске теста я получаю предупреждение об отказе

DEPRECATION WARNING: This dynamic method is deprecated. Please use e.g. Post.find_or_initialize_by(name: 'foo') instead. (called from bump_progress at /Users/newimac/RailsApp/bank/app/models/child.rb:200)

Итак, я обновил свой запрос следующим образом:

progress = Progress.where('chore.id' => 'chore_id', 'period[chore.frequency]' => 'period', 'chore.account_id' => 'account_id').first_or_initialize

Но он не работает. Правильно ли мой запрос?

Ответ 1

Вы можете использовать следующее:

Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id) 

Ответ 2

# find_or_initialize_by_
# Rails 3: 
Team.find_or_initialize_by_name('Justice League')
# Rails 4: 
Team.find_or_initialize_by(name: 'Justice League')
# or
Team.where(name: 'Justice League').first_or_initialize

NB: В этих случаях слово "initialize" будет похоже на вызов Team.new, но "initialize" можно заменить на "create", чтобы вызвать вызов Team.create, например: .find_or_create_by или .first_or_create

Расширенные и улучшенные, но основанные на: http://blog.remarkablelabs.com/2012/12/what-s-new-in-active-record-rails-4-countdown-to-2013