LoginSignup
1
1

More than 3 years have passed since last update.

Rails5でINSERT IGNOREする

Posted at

色々あるみたいです。

インサートしたidは不要!パターン

インサート後、id(オートインクリメントされるプライマリーキー)は不要の場合。

1. create! rescue

対象が数件のときには簡単便利。

param = {
  id: 6,                # プライマリーキー
  name: 'ポール・ポグバ',
  position: 'MF'
}
Pogba.create!(param) rescue ActiveRecord::RecordNotUnique

idやユニークインデックスをparamに指定しておけば、重複時に発生する例外をrescueですっ飛ばせる。
参考:https://stackoverflow.com/questions/31396310/insert-ignore-into-table-statement-in-rails-active-records

2.gemactiverecord-importを利用

対象が大量にある場合に便利。

ksk.push(Honda.new(id: 10, name: '本田圭佑', position: 'いい意味でプレッシャー'))
ksk.push(Honda.new(id: 33, name: '本田圭佑', position: 'ケイスケ・ホンダ'))
...

Honda.import ksk on_duplicate_key_ignore: true

ちなみにPostgreSQLだけにはなるが、インサートしたあとにidが取得できるらしい。
参考:https://github.com/zdennis/activerecord-import#duplicate-key-ignore

インサートしたidが欲しい!パターン

1. find_or_initialize_by

param = {id: 45, name: 'マリオ・バロテッリ', position: 'FW'}
milano = Intel.find_or_initialize_by(param)

milano.update(param) if milano.new_record?

update(param)で「INSERT INTO〜」が実行されるのはキモチワルイ。
参考:https://qiita.com/taimuzu/items/0a21738d018f475d63ae

find_or_create_byもあるけどブロック内でわざわざINSERTする値を作り直さなきゃいけないので面倒。(なんか他にいい方法あるのかな)
参考:https://qiita.com/yusabana/items/1b566f61ca556a482f52

1
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
1
1