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à.

25
demandé sur Jason Swett 2011-01-14 23:25:05

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.

14
répondu Andy Lindeman 2011-01-14 20:32:32

je viens de courir à travers cette bibliothèque: https://github.com/seamusabshere/upsert

je n'ai pas encore testé, mais il semble prometteur

13
répondu jacklin 2012-06-21 18:51:32

Il y a aussi le Modèle.find_or_create

2
répondu Pasta 2011-01-14 20:50:48

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;
0
répondu Serge Seletskyy 2016-04-22 10:03:21

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)
-1
répondu Nithin Krishna 2014-08-17 18:53:22