0
일부 레일 모델에 대한 감사 기능을 구현하고이를 외부 "이벤트"데이터베이스 (우리는 BigQuery를 선택)에 저장하려고합니다.레일 모델에 대한 감사 기능
각 이벤트는 아주 기본적인해야한다 :
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
을 : before_json, after_json, DIFF, 액션, 나는 내 모델에 추가 할 계획입니다 이러한 문제를 만들기 시작, 그래서
를 것으로, object_id 내가 구현하는 방법을 알지 못하는 것은 객체의 이전 상태를 가져 와서 관련 필드와 두 상태 사이의 diff를 채울 수 있습니다.어떻게 할 수 있습니까? 나는 이전과 이후 사이 DIFF을 계산하는 '액티브-DIFF "라는 외부 보석을 사용하고
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
주의 사항 :