おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Rails 4.0 で新しく追加される予定の find_or_create_by メソッドについて

EdgeRails.info見てたら気になったので調べました。

最近 rails の master に、 rails 3.x 系でよく使っていた first_or_create と似たメソッド find_or_create_by が追加されました。そして first_or_create の方はメソッドの説明が削除され、depricated ぽい扱いになるようです。

詳しくは rails/activerecord/CHANGELOG.md at 300d080ada31ac297264e6abba6ca16cd2db5925 · rails/rails · GitHub の真ん中辺りに書かれていますが、どうやら first_or_createwhere などのメソッドが先にいくつかチェーンでつながってから書かないといけないので読みづらい!ということみたいですね。大事なことを最初に書きたい!という英語っぽい発想?

create するときの属性を、find するときの条件+αにしたい場合は下記のように書くことをオススメしています。

User.create_with(active: true).find_or_create_by(first_name: 'Jon')
User.find_or_create_by(first_name: 'Jon') { |u| u.active = true }

上記のコードをfirst_or_createで書くとこう。

User.where(first_name: 'Jon').first_or_create(active: true)

正直、たいして読みやすさが増している気がしないのですが…。英語圏の人だとfind_or_create_byの方が自然なんでしょうかね。