実現したいこと
以下のように複数のbookデータがあり、データベースに当該book_idのレコードがなければ(重複していなければ)、
そのbookデータをデータベースに保存するという処理を行っています。
book_arr = [ {"book_id"=>1, "title"=>"A"}, {"book_id"=>2, "title"=>"B"}, {"book_id"=>3, "title"=>"C"}, ] book_arr.each{|book| unless Book.exist?(book_id: book["book_id"]) b1 = Book.new( book_id: book["book_id"], title: book["title"] ) b1.save end }
これで一応、目的の処理は果たせているのですが、1件1件データベースに接続して保存しているので
効率が悪く、パフォーマンス的にはよくないです(DBの接続は極力少なくしたいです)。
これを一括でまとめて保存するにはどのように実装すればよいでしょうか?
試したこと
調べたところ、以下のようなコードの書き方があるみたいなので、
User.create( [ { name: 'taro', age: 20 }, { name: 'hanako', age: 25 } ] )
この書き方で、以下のようにすればまとめて保存できることはわかりました(実際に確かめました)。
Book.create(book_arr)
しかし、以下のように重複していなければ保存するという書き方がわかりませんでした。
unless Book.exist?(book_id: book["book_id"])
また、さらに調べたところ、以下のような複数の条件も指定できるみたいですが、
1件でもあったら(存在したら)、一切、レコードを挿入しないということをしたいのではなく、
重複するレコードのみ挿入せず、重複しない他のレコードは挿入したいので、この書き方も違うかなと思いました。
User.exists?(id: [1, 2, 3] )
そもそもこういった目的の実装は不可能でしょうか?
補足情報(FW/ツールのバージョンなど)
Rails 7.0.4
ruby 3.1.2p20

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/05/19 03:01