Railsでbulk_insertを行う際に uuid_generate_v4() が走らない問題の対処法

こんにちは!kossyです!




今回はRailsPostgreSQLを使っていて、bulk_insertを行う際に uuid_generate_v4() が走らない問題の対処法について、
ブログに残してみたいと思います。





環境
Ruby 2.6.6
Rails 6.0.3
PostgreSQL 12系



Securerandomモジュールのuuidメソッドを使う

docs.ruby-lang.org

RailsActiveRecord-importを用いてbulk_insertを行う場合、直接SQLを実行するため、uuidを自動挿入する uuid_generate_v4()関数が走りません。

この場合、インスタンスの生成時に Securerandomモジュールのuuidメソッドが生成する値をattrに代入すればOKです。

以下は簡単なサンプルコードです。

now = Time.zone.now

users = []
rows.each do |row|
  users << User.new(uuid: Securerandom.uuid, name: row[:name], row[:email], row[:password], created_at: now, updated_at: now)
end

User.import books

まとめ

bulk_insertを行う時は、カラムのdefault値に特別な関数を当てているケースに注意しましょう。