2

activerecord-import gemを使用して、複数のActiveRecordドキュメントを1つのクエリでインポートしています。次に、保存されたドキュメントIDを使用して関連する関連付けを初期化し、それらをインポートするなどです。ActiveRecord-import gemを使用して一括挿入を実行するPaperTrailのバージョンを初期化するにはどうすればよいですか?

ただし、保存されたすべてのドキュメントのcreateイベントのあるPaperTrail gemバージョンが必要です。

一括挿入を実行できるように初期化する方法はありますか?

:AR-Import gemはすべてのコールバックを無視するので、インポート後に手動で処理しています。

ありがとうございます!


UPD-20/05/17:私はPaperTrail::Modelのパッチでこれを解決してきた瞬間に

。ここに私の.../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) 

答えて

0

はい、それはあなたのversionsテーブルへの一括挿入レコードに可能でなければなりません。

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") 

ActiveRecordでもプレーンSQLでも可能ですので、覚えておいてください、PaperTrail::Versionは通常のARモデルです。

+0

私はこれを知っていました。私は紙の痕跡の中から初期化されたARオブジェクトのバージョンを初期化する方法を見つける必要があります。これは問題で、 ':after_create'コールバックのみを使用しています。これは無視され、バルク挿入を初期化して実行する際には役に立たないからです。私はパッチを使ってこのための一時的な解決策を見つけました。 –

+0

私はちょうど私の質問を更新し、私の現在の解決策をパッチに含めました。 –

関連する問題