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_create
は where
などのメソッドが先にいくつかチェーンでつながってから書かないといけないので読みづらい!ということみたいですね。大事なことを最初に書きたい!という英語っぽい発想?
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
の方が自然なんでしょうかね。