🔥
ActiveRecord-Importを使用してRailsでデータを効率的にインポートする
Railsで大量のレコードをデータベースに一括で登録、更新したいとき、activerecord-import
というgemが非常に便利です。この記事では、その基本的な使い方と、特にPostgreSQLでの高度なオプションの使用方法を解説します。
1. activerecord-importの導入
まずは、Gemfileに以下を追加し、bundle install
を実行してインストールします。
gem 'activerecord-import'
2. 基本的な使用方法
users = []
10.times do |i|
users << User.new(name: "User #{i}")
end
User.import users
これで、users
配列に格納されたユーザーデータが一括でデータベースにインポートされます。
3. データベースに既に存在するレコードの処理
on_duplicate_key_update
オプションを使用すると、データベースに既に存在するレコードの処理を指定できます。
books = [
{ id: 1, title: 'Book 1', author: 'Author 1' },
{ id: 2, title: 'Book 2', author: 'Author 2' }
]
options = {
on_duplicate_key_update: {
columns: [:title, :author],
conflict_target: [:id],
condition: "books.updated_at < excluded.updated_at"
}
}
Book.import books, options
4. PostgreSQLでの高度なオプション
-
conflict_target: データベースに既に存在するレコードを判定するためのカラムを指定します。ここでは、
id
カラムを指定していますが、任意のカラムを指定することが可能です。
conflict_target: [:id]
- condition: データベースに既に存在するレコードをupdateする条件を指定します。
condition: "books.updated_at < excluded.updated_at"
excluded
は、現在更新しようとしているレコードを参照するための特別なキーワードです。
5. まとめ
activerecord-import
を使用すれば、大量のデータを効率的にRailsのデータベースにインポートすることができます。特に、データベースに既に存在するレコードの処理をon_duplicate_key_update
オプションを用いて柔軟に制御できることが強みです。また、PostgreSQLを使用している場合には、conflict_target
とcondition
オプションを使用することで、さらに高度な挙動を定義することが可能です。
Discussion