83
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

Rails 4で非推奨になった/なっていないfinderメソッドを整理する

はじめに: 問題

さて、いきなり問題です。
Rails 4.0から非推奨(deprecated)になったfinderメソッドは次のうちどれでしょうか?

User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')

User.find_by(email: 'foo@example.com')

User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')

答え合わせ

みなさん、わかりましたか?
正解はこちらでした!

User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')

それ以外のfinderメソッドはRails 4.0でも使えます。
というか、厳密にいうと以下のfinderメソッドはRails 4.0から新しく登場したfinderメソッドです。

User.find_by(email: 'foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')

なので、「Rails 3時代から引き続き使えるfinderメソッド」という意味では、該当するのは以下のfinderメソッドだけになります。

User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')

非推奨になった/なっていないfinderメソッドを整理する

ここで上記の内容を整理してみましょう。

Rails 4.0からは非推奨になったfinderメソッド

User.find_or_initialize_by_email('foo@example.com')
# または 
User.find_or_create_by_email('foo@example.com')

Rails 4.0でも引き続き使えるfinderメソッド

User.find_by_email('foo@example.com')

User.find_by_email_and_name('foo@example.com', 'Foo Bar')

Rails 4.0から新しく登場したfinderメソッド

User.find_by(email: 'foo@example.com')

User.find_or_initialize_by(email: 'foo@example.com')
# または 
User.find_or_create_by(email: 'foo@example.com')

非推奨になったその他のfinderメソッド

Rails 4.0以降では User.find_or_initialize_by_... 以外にも非推奨になった以下のfinderメソッドがあります。

  • find_all_by_...
  • find_last_by_...

非推奨になったfinderメソッドを書き直す方法

非推奨となったfinderメソッドはそれぞれ以下のように書き直します。

# Rails 3
User.find_or_initialize_by_email('foo@example.com')
# Rails 4 (find_or_create_by_...の場合も同様)
User.find_or_initialize_by(email: 'foo@example.com')
# または
User.where(email: 'foo@example.com').find_or_initialize 

# Rails 3
User.find_all_by_name('Foo Bar')
# Rails 4
User.where(name: 'Foo Bar')

# Rails 3
User.find_last_by_name('Foo Bar')
# Rails 4
User.where(name: 'Foo Bar').last

書き直す時間がない!という場合は以下のgemを使って延命処置を施すこともできます。

Rails 4.1以降では警告ではなく、エラーになります

Rails 4.0で非推奨になったfinderメソッドはRails 4.1から使えなくなっています。
エラーが出た場合は新しい記法に書き直すか、activerecord-deprecated_finders gemをbundleしてください。

まとめ

find_by みたいなメソッド名を見るとつい「あれ、これって非推奨じゃなかったっけ?」と記憶があやふやになることが多いので、ここで一通り情報を整理してみました。

僕と同じように「あー、どれだっけ?」と迷った場合はこの記事を参考にしてみてください。

参考文献

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
83
Help us understand the problem. What are the problem?