Rails6で追加 レコードを一括登録できるinsert_allについて

2021年9月22日水曜日

Rails

t f B! P L

 


insert_allの概要

rails6で追加された。複数レコードを一括登録できる。

insert_allドキュメント

insert_allの使い方

形としてはこんな感じ。

モデル.insert_all([{カラム: value...},{カラム: value...}...])

Task.insert_all([
  {user_name: "太郎", created_at:"2021/09/20 09:00", updated_at: "2021/09/20 09:00"},
  {user_name: "花子", created_at:"2021/09/20 09:00", updated_at: "2021/09/20 09:00"},
  ])

→発行されるSQLは1個だけ!うれしい⭐️
INSERT INTO "tasks" ("user_name","created_at","updated_at") VALUES ('太郎', '2021-09-20 09:00:00', '2021-09-20 09:00:00'), ('花子', '2021-09-20 09:00:00', '2021-09-20 09:00:00') RETURNING "id"

insert_allの注意点

created_at, updated_atは自動付与されないので未指定の時はエラーになる

ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR:  null value in column "created_at" of relation 

対策

  • 上に書いた例のようにデータ自体にcreated_at達を直接指定する。

  • マイグレーションファイルにtimestampのデフォルト指定する。多分これでできる。動作確認まではしていない
t.timestamps null: false, default: ->{ "CURRENT_TIMESTAMP" }

  • create_withを使う。全データにセットする必要がなくなってシンプルではある
Task.create_with(created_at:"2021/09/20 09:00", updated_at: "2021/09/20 09:00").insert_all([
  {user_name: "太郎"},
  {user_name: "花子"},
])

自己紹介

Webエンジニアをやっています。日々思ったことや、読書レビュー、IT系の記事などを書き連ねています

広告

[書籍] 世界一楽しい決算書の読み方感想まとめ

  こういう人におすすめ 決算書を読もうとして挫折した人 企業分析したい投資家 会社で経営企画担当、管理職などのポジションの人 概要 著者はTwitterで会計クイズを行なっている 「大手町のランダムウォーカー」さん 。 「日本人全員が財務諸表を読める世界を創る」 を合言葉にして...

QooQ