응용 프로그램 컨트롤러. 이것은 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']
내가 모니터링에 관심이 필드 내가 정의 된 직원 모델
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
끝
그리고 그 것이다. 계정에서 사용 가능하게하면 앱은 특정 필드를 감시하고 해당 필드의 모든 변경 사항을 테이블에 기록하여 간단한 감사 추적을 작성합니다.
나는 paper_trail 또는 vestal_versions을 고집한다고 말하고 싶습니다. 모든 기능이 필요하지는 않지만 작업을 수행하고 많은 오버 헤드가 없습니다. 2 중 paper_trail이 더 활발한 것으로 보입니다. – PinnyM