railsのfind_or_create_by(!)が便利

find_or_create_by - リファレンス - - Railsドキュメント

find_or_create_byは検索条件を指定して、該当のレコードが一件もなければ

新規レコードを作成してくれます

rails4系から実装されたので、古いrailsでは使えません><

最近はクローラーをよく作るのですが、キーとなるデータで検索をして

該当データがなければレコードを作成して、詳細情報のupdateは非同期処理しております

user情報や商品情報なんか、めっちゃ便利ですね

railsから離れられなくなりそうです

ソースコード

こちらから引用

rails/relation.rb at 78bd18a90992e3da767cfe492f1bc5d63077da8a · rails/rails · GitHub

    def find_or_create_by(attributes, &block)
      find_by(attributes) || create(attributes, &block)
    end

    # Like <tt>find_or_create_by</tt>, but calls <tt>create!</tt> so an exception
    # is raised if the created record is invalid.
    def find_or_create_by!(attributes, &block)
      find_by(attributes) || create!(attributes, &block)
    end

ソースコードもとてもシンプルでfind_by or createです

Active Recordのcreateの戻り値は成功可否に関わらずobjectです

結構はまるんですが、失敗しても例外が発生しないのでfind_or_create_by!を使うことが多いです

またレコードが見つかった場合は、どちらもfind_byなので1件だけ取得されることに注意します

複数件とってくる場合はwhereを使えばOKです

複数件取得or作成したい!って場合はfind_or_create_byのコードを参考にすれば良いのかな(あまり用途なさそうだけど)

railsは楽しいです(白目)