0
いくつかのレールモデルの監査機能を実装し、それを外部の「イベント」データベース(BigQueryを選択)に保存しようとしています。レールモデルの監査機能
各イベントには、非常に基本的でなければなりません: before_json、after_json、デフ、アクションは、そう
をOBJECT_ID、私は私のモデルに追加することを計画していこの懸念を構築開始しました:
module Auditable
extend ActiveSupport::Concern
included do
before_destroy {audit(:destroy)}
after_validation on: :update do
audit(:update)
end
after_validation on: :create do
audit(:create)
end
def audit(action)
EventSender.send(before_json, self.to_json, diff, action, self.id)
end
end
end
私が実装する方法を知っていないのは、オブジェクトの前の状態を取得して、関連するフィールドと2つの状態間の差分を設定できるということだけです。
どうすればいいですか?私は前と後との差分を計算するために、「ActiveRecordの-デフ」と呼ばれる外部の宝石を使用してい
module Auditable
require 'active_record/diff'
extend ActiveSupport::Concern
included do
include ActiveRecord::Diff
before_destroy {audit(:destroy, before: before_state)}
after_validation on: :update do
audit(:update, before: before_state, after: self)
end
after_create do
audit(:create, after: self)
end
def audit(action, before: {}, after: {})
diff = case action
when :update
before.diff(after)
when :create
after
when :destroy
before
end
BigQueryClient.new.insert(
self.class.to_s.downcase,
{
before: before.to_json,
after: after.to_json,
diff: diff.to_json,
action: action,
"#{self.class.to_s.downcase.to_sym}_id": self.id
},
dataset_name: "audit"
)
end
private
def before_state
self.class.find(self.id)
end
end
end
お知らせ: