コールバックを呼ばずにデータを作りたい
Railsでレコードを作成する時、コールバックを発火させずにデータを作成したい時が(基本的にない方がよいですが)ごく稀に存在します。
データを大量に作る時は、Rails6以降なら下記のようにinsert_allを使うと良いでしょう。
Article.insert_all([
# created_at、updated_atが存在しrecord_timestampsをfalseにする場合、attributesの中に書いておく必要があるので注意
{ title: "How to use qiita", author_id: 1 },
{ title: "Why does elasticsearch use inverted index?", author_id: 2 }
])
しかし、一つのレコードしか作らないのにinsert_all
を使うために配列を作るのは少々大仰な気がします。
そこでinsertメソッド
このような時は、insert
メソッドを利用することで、コールバックなしでデータを作成することができます。
Article.insert(
{ title: "How to use qiita", author_id: 1 }
)
createメソッドなどと同様、登録できなかった場合にエラーを出させたい場合はinsert!
を使うと良いです。
また、オプションもinsert_all
同様、タイムスタンプの自動設定を強制の可否決められるrecord_timestamps
、戻り値の属性を指定できるreturning
、重複でスキップするカラムを指定できるunique_by
の3オプションが利用できます。
returning
オプションはPostgreSQLのみ、unique_by
オプションはPostgreSQLとSQLiteのみのオプションです。