Upsert in Rails ActiveRecord
-
11-10-2019 - |
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à.
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)