2

J'utilise activerecord-import gem pour importer plusieurs documents ActiveRecord dans une seule requête. Ensuite, j'initialise les associations associées en utilisant des identifiants de documents enregistrés et en les important aussi, et ainsi de suite.Comment initialiser les versions de PaperTrail pour effectuer une insertion en masse avec ActiveRecord-import gem?

Cependant, je dois avoir PaperTrail gem versions avec create événement pour tous les documents enregistrés.

Existe-t-il un moyen simple de les initialiser pour permettre une insertion en masse?

NOTE: La gemme AR-Import ignore tous les rappels, donc je les ai traités manuellement après l'importation.

Merci!


UPD-20/05/17:

Au moment où je l'ai résolu ce problème avec le patch pour PaperTrail::Model. Voici mon .../initializers/paper_trail.rb:

module PaperTrail 
    class Version < ActiveRecord::Base 
    ...  
    end 

    module ModelPatch 
    extend ActiveSupport::Concern 

    included do 
     # new method added to PaperTrail::Model module to make possible initialize 
     # `create` versions right after importing resources. 
     # This method contains modified code from private PaperTrail::Model::InstanceMethods#record_create 
     # Difference: 
     # - instead of `create!` we use `new` but with validation and raise exception if it's invalid. 
     # This is for reinsurance that if something changes after update PaperTrail gem in future 
     # everything still works or need to fix it. 
     def initialize_record_create_version 
     return nil unless paper_trail_switched_on? 
     data = { 
      event:  paper_trail_event || 'create', 
      whodunnit: PaperTrail.whodunnit 
     } 

     if changed_notably? && self.class.paper_trail_version_class.column_names.include?('object_changes') 
      data[:object_changes] = if self.class.paper_trail_version_class.object_changes_col_is_json? 
      changes_for_paper_trail 
      else 
      PaperTrail.serializer.dump(changes_for_paper_trail) 
      end 
     end 
     new_v = send(self.class.versions_association_name).new merge_metadata(data) 
     new_v.valid? ? new_v : fail("Invalid PaperTrail Version: #{new_v.errors&.messages}") 
     end 
    end 
    end 
end 

PaperTrail::Model.send(:include, PaperTrail::ModelPatch) 

Répondre

0

Oui, il devrait être possible de dossiers en vrac insérer dans votre table versions. Parce que cela est possible avec du SQL simple, cela est également possible avec ActiveRecord.

insert into versions 
(item_id, item_type, event, created_at) 
(1, "User", "create", "2016-02-29"), 
(2, "User", "create", "2016-02-29"), 
(1, "Widget", "create", "2016-02-29") 
Rappelez-vous, PaperTrail::Version est un modèle AR classique.

+0

Je le savais. J'ai besoin de trouver quelque chose de différent - comment initialiser des versions pour juste AR-objets initialisés de l'intérieur de la trace de papier. C'est un problème car ils utilisent uniquement le rappel ': after_create' qui est ignoré et inutile lorsque j'initialise et que j'effectue une insertion en bloc. J'ai trouvé une solution temporaire pour ce patch. –

+0

Je viens de mettre à jour ma question et inclus ma solution actuelle avec le correctif. –