🔥

ActiveRecord-Importを使用してRailsでデータを効率的にインポートする

2023/08/02に公開

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_targetconditionオプションを使用することで、さらに高度な挙動を定義することが可能です。

Discussion