36

ActiveRecordには組み込みのアップサート機能がありますか?私は自分でそれを書くことができることを知っていますが、そのようなものがすでに存在する場合、私は明らかに書きたくありません。

4

7 に答える 7

22

Rails6には素晴らしい新機能がありupsertますupsert_allActiveRecord

詳細については、https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-upsert_allを参照してください。

于 2019-06-25T17:28:49.317 に答える
15

Model.find_or_initializeおそらくあなたが望むことをします。あなたはそれを連鎖させることができます、saveあるいはupdate_attributesそれが理にかなっているなら。

詳細については、Railsガイドをご覧ください。

于 2011-01-14T20:32:32.067 に答える
14

私はちょうどこのライブラリに出くわしました: https ://github.com/seamusabshere/upsert

まだテストしていませんが、有望に見えます

于 2012-06-21T18:51:32.597 に答える
2

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;
于 2016-04-22T10:03:21.827 に答える
2

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]
于 2019-12-20T13:25:26.457 に答える
1

Model.find_or_createもあります

于 2011-01-14T20:50:48.330 に答える
-1

これを実現する方法についてブログに投稿しました。こちらをご覧ください。

アクティブなレコード拡張を作成する必要があります。こんな感じになります。

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)
于 2014-08-17T18:53:22.743 に答える