色々あるみたいです。
インサートした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