最初に行ったのは、アプリケーション コントローラーにアラウンド フィルターを配置することでした。これは、current_employee を従業員モデルに取り込む方法でした。これは、特に私のような初心者にとっては困難でした。
around_filter :set_employee_for_log, :if => Proc.new { @current_account &&
@current_account.log_employee_changes? && @current_employee }
def set_employee_for_log
Thread.current[:current_employee] = @current_employee.id
begin
yield
ensure
Thread.current[:current_employee ] = nil
end
end
end
次に、従業員モデルで、監視に関心のあるフィールドを定義しました
CHECK_FIELDS = ['first_name', 'last_name', 'middle_name']
次に、変更を実際にキャプチャするためにいくつかのフックを追加しました IF ログがアカウント レベルで有効になっている場合
before_update :capture_changed_columns
after_update :log_changed_columns, :if => Proc.new { self.account.log_employee_changes? }
def capture_changed_columns
@changed_columns = changed
@changes = changes
end
def log_changed_columns
e = EmployeeChangeLog.new
Employee::CHECK_FIELDS.each do |field|
if self.send("#{field}_changed?")
e.send("#{field}=", self.send(field))
end
end
if e.changed?
e.update_attribute(:account_id, self.account.id)
e.update_attribute(:employee_id, self.id)
e.update_attribute(:employee_ref, self.employee_ref)
e.update_attribute(:user_id, Thread.current[:current_employee])
e.save
else return
end
終わり
以上です。アカウントで有効にすると、アプリは特定のフィールドを監視し、それらのフィールドへのすべての変更がテーブルに記録され、単純な監査証跡が作成されます。