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)
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. –
Je viens de mettre à jour ma question et inclus ma solution actuelle avec le correctif. –