Domanda

non ActiveRecord hanno un built-in funzionalità upsert? So che potrei scrivere io stesso, ma io ovviamente non voglio, se una cosa del genere esiste già.

È stato utile?

Soluzione

Model.find_or_initialize probabilmente fa quello che vuoi. È possibile concatenare con save o update_attributes se questo ha un senso.

Più informazioni nel Rails Guide .

Altri suggerimenti

Ho appena imbattuto in questa biblioteca: https://github.com/seamusabshere/upsert

non ho ancora testato, ma sembra promettente

C'è una caratteristica nuova impressionante in rotaie 6: hanno aggiunto upsert e upsert_all a ActiveRecord

Maggiori informazioni possono essere trovate qui https: / /edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-upsert_all

C'è anche Model.find_or_create

meccanismo IMO upsert richiede configurazione personalizzata per ciascun modello.

Quindi la soluzione migliore sarebbe quella di implementare una query SQL personalizzata per un modello, per es.

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;

avevo scritto un post sul blog su come possiamo raggiungere questo obiettivo. Check it out qui .

Dovrete scrivere un'estensione record attivo. Essa sarà simile a questo.

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top