11
1

More than 1 year has passed since last update.

[Tips]insertメソッドでコールバックを発火させずに単一のレコードを作成する(Rails)

Last updated at Posted at 2022-08-22

コールバックを呼ばずにデータを作りたい

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のみのオプションです。

REF

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1