ActiveRecordには組み込みのアップサート機能がありますか?私は自分でそれを書くことができることを知っていますが、そのようなものがすでに存在する場合、私は明らかに書きたくありません。
7 に答える
Rails6には素晴らしい新機能がありupsert
ますupsert_all
。ActiveRecord
Model.find_or_initialize
おそらくあなたが望むことをします。あなたはそれを連鎖させることができます、save
あるいはupdate_attributes
それが理にかなっているなら。
詳細については、Railsガイドをご覧ください。
私はちょうどこのライブラリに出くわしました: https ://github.com/seamusabshere/upsert
まだテストしていませんが、有望に見えます
IMO Upsertメカニズムでは、モデルごとにカスタム構成が必要です。
したがって、最善の解決策は、モデルのカスタムSQLクエリを実装することです。
insert into <table> (<field_1>, ..., <field_n>)
values (<field_1_value>, ..., <field_n_value>)
on duplicate key update
field_x = field_x_value,
...
field_z = field_z_value;
Rails 6では、この場合にcreate_or_find_byが導入されていますhttps://github.com/rails/rails/pull/31989
また、レコードの大部分については、https://github.com/zdennis/activerecord-importを使用することができます
例:
Book.import [book], on_duplicate_key_update: [:title]
Model.find_or_createもあります
これを実現する方法についてブログに投稿しました。こちらをご覧ください。
アクティブなレコード拡張を作成する必要があります。こんな感じになります。
module ActiveRecordExtension
extend ActiveSupport::Concern
def self.upsert(attributes)
begin
create(attributes)
rescue ActiveRecord::RecordNotUnique, PG::UniqueViolation => e
find_by_primary_key(attributes['primary_key']).
update(attributes)
end
end
end
ActiveRecord::Base.send(:include, ActiveRecordExtension)