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は楽しいです(白目)