Upsert in Rails ActiveRecord
Ne ActiveRecord dans upsert fonctionnalité? Je sais que je pourrais l'écrire moi-même, mais je ne veux évidemment pas si une telle chose existe déjà.
5 réponses
Model.find_or_initialize
probablement fait ce que vous voulez. Vous pouvez enchaîner avec save
ou update_attributes
si cela fait sens.
Plus d'infos dans le Rails Guides.
je viens de courir à travers cette bibliothèque: https://github.com/seamusabshere/upsert
je n'ai pas encore testé, mais il semble prometteur
OMI Upsert mécanisme nécessite une configuration personnalisée pour chaque modèle.
donc la meilleure solution serait d'implémenter une requête SQL personnalisée pour un modèle, par exemple
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;
j'avais écrit un billet de blog sur la façon dont nous pouvons atteindre cet objectif. Check it out ici.
vous devrez écrire une extension d'enregistrement active. Il ressemblera à quelque chose comme ça.
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)