2016-07-24 10 views
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 

お知らせ:

答えて

0

私はそれを次のように解決しました。