gem "activerecord-import"
Railsに大量のレコードをDBに一括登録・更新したいときには、gem "activerecord-import" が活用できます。
例えば、以下のようなコードでは、10回のSQLが発行されます。
10.times do |i| Book.create! name: "book #{i}" end
これを、"activerecord-import"を使って書くと以下となり、1回のSQL発行で済ませることができます。
books = [] 10.times do |i| books << Book.new(name: "book #{i}") end Book.import books
このimportメソッドは、カラム名 (文字列または記号) の配列と配列の配列を受け取ることができます。
各子配列は、個々のレコードとその値のリストをカラムと同じ順番で表します。
これで少ないクエリ発行回数で高速なインポートが実現できます。
なお、このgemには他にもいくつかのオプションが用意されています。
on_duplicate_key_ignore
on_duplicate_key_ignoreは、Keyが重複したときにレコードのスキップを許容するオプションです。
MySQL、SQLite、PostgreSQL(9.5以降)はon_duplicate_key_ignoreをサポートしており、主キー制約や一意キー制約に違反した場合にレコードをスキップすることができます。
importメソッドの後に、trueやfalseを指定して付与します。
Book.import [book], on_duplicate_key_ignore: true
batch_size
batch_size はインポートごとに挿入するレコードの最大数を指定するオプション です。
参照:batch_size
関連:【Learning Diary36】DISTINCTとuniq /バルクインサート/transaction/網羅方法
.perform_later
RailsのActive Jobは、ジョブを活用してバックエンドでさまざまなキュー操作を行うためのフレームワークです。
キューへのジョブ登録を行うメソッドは.perform_laterです。
gem "sentry-ruby" と"sentry-rails"
Rails側に設定しておくことで、エラー発生時にSlackへ通知してくれるgemがあります。
以下の記事でとてもわかりやすく解説されていました。
参照:モダンな監視ツールSentryをRailsで使ってみた