leaning diary Rails

【Learning Diary48】レコードの一括登録・slackへの通知を可能にするRaile gems


【Learning Diary48】レコードの一括登録・slackへの通知を可能にするRaile gems

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

参照:on_duplicate_key_ignore

batch_size

batch_size はインポートごとに挿入するレコードの最大数を指定するオプション です。

参照:batch_size

関連:【Learning Diary36】DISTINCTとuniq /バルクインサート/transaction/網羅方法

.perform_later

RailsのActive Jobは、ジョブを活用してバックエンドでさまざまなキュー操作を行うためのフレームワークです。

キューへのジョブ登録を行うメソッドは.perform_laterです。

参照:Railsガイド .perform_later

gem "sentry-ruby" と"sentry-rails"

Rails側に設定しておくことで、エラー発生時にSlackへ通知してくれるgemがあります。

以下の記事でとてもわかりやすく解説されていました。

参照:モダンな監視ツールSentryをRailsで使ってみた

-leaning diary, Rails