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