insert_allの概要
rails6で追加された。複数レコードを一括登録できる。
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: "花子"},
])
0 件のコメント:
コメントを投稿