在 Rails 中审计记录
Posted
技术标签:
【中文标题】在 Rails 中审计记录【英文标题】:Auditing Records In Rails 【发布时间】:2014-12-07 07:26:27 【问题描述】:我有一个 Rails 3.2.14 应用程序,它有一个 Call
模型和许多不同的关联。我希望能够跟踪Call
模型的更改并以某种方式显示Call
显示视图中的更改列表。
我一直在阅读有关 audited gem 的信息,它看起来可能会奏效。但在我深入研究之前,我想知道以下几点。
如何从显示视图中调用审核?我假设我可以做一些事情,比如传递一个块:
<% @call.audits.each do |a| %>
<%= a.action %> <%= a.audited_changes %>
<% end %>
当我需要查看对特定调用所做的更改时,这样的内容是否可以在显示视图中使用?
audited
gem 如何处理关联,尤其是has_many_through
?
我希望尽快实现此功能,但不想在我的应用中引入任何问题。我认为在开发环境中安装可能是最好的途径?
如果有人有使用此 gem 的经验或可以帮助提供答案,我将不胜感激。
更新
所以我尝试安装审核的 gem,我能够显示审核操作和 audited_changes。但是audited_changes的格式是一个序列化的hash。我怎样才能反序列化它并使字段友好?此外,在使用 has_many_through
关系/连接表时,gem 似乎不会记录更改。所以我现在拥有的是一个半工作的审计 gem,其中的数据对用户不友好。有什么方法可以美化它并使其对用户有意义?
call.rb 摘录
has_many :call_units
has_many :units, through: :call_units
belongs_to :nature
belongs_to :service_level
belongs_to :patient_sex
belongs_to :insurance
belongs_to :region
has_many :call_special_equipments
has_many :special_equipments, :through => :call_special_equipments
belongs_to :transferred_from, :foreign_key => :transfer_from_id, :class_name => 'Facility'
belongs_to :transferred_to, :foreign_key => :transfer_to_id, :class_name => 'Facility'
belongs_to :parent_call, class_name: "Call"
has_many :notes
belongs_to :cancel_reason
【问题讨论】:
我看到您最近的编辑是一年前,但必须问:您是否设法以可读的方式显示您的审核?如果没有,我可以提供帮助。 我知道现在已经很久了,但我似乎无法弄清楚如何在索引页面中显示更改,我已将audited
添加到用户模型中。
【参考方案1】:
我已使用paper_trail gem 来审核记录更改这是另一个 SO 答案,它显示了如何显示记录增量:Display all versions of individual records in Papertrail
没有贬低经过审核的 gem。
【讨论】:
你能详细说明你是如何做到的吗?还包括关联记录并且有很多直通关系? 您希望使用Call
模型跟踪哪些关联?您可以将相关的源代码添加到您的问题中吗?
好的,我会发布我的通话模型的摘录。
我已经发布了来自 Call
模型的关联。我正在尝试跟踪对多态和has_many_through
关联的更改。您能否提供有关如何实施 paper_trail 以跟踪更改的答案?我真的很想让这个工作。
@cz3ch - 我正在处理一个类似的问题,经过一番研究后推断,没有现成的解决方案可以跟踪相关模型的更改,从而使对用户有意义的这些变化的呈现。我选择编写一个自定义类,该类将跟踪关联模型的更改并将它们存储在父模型的 Papertrail 元数据列中。这似乎是最好的解决方案,但如果其他人有更好的解决方案,我们很高兴能改正。【参考方案2】:
我们使用这样的东西:
# app/views/audit_trail/index.html.haml
.table-responsive
%table
%thead
%tr
%th Record
%th Associated With
%th By
%th Action
%th Changes
%th Version
%th Remote Address
%th Timestamp
%tbody
= render @audits
# app/views/audited/adapters/active_record/audits/_audit.html.haml
%tr
%td
= "#audit.auditable_type:"
%br
= "'#audit.auditable.try(:audited_friendly)'"
%td= audit.associated.try(:audited_friendly)
%td= audit.user.try(:name)
%td= audit.action
%td= audit.audited_changes
%td= audit.version
%td= audit.remote_address
%td= audit.created_at
请注意,audited_friendly
是我们添加到已审核模型的方法。例如,User
模型返回 name
属性,但 Pattern
模型返回 label
属性。
更新
以下是具有审计 (User
) 的对象和与记录关联的对象 (Client
) 的审计记录的相关控制器方法:
# app/controllers/audits_controller.rb
def index
load_user if params[:user_id]
load_client if params[:client_id]
@audits = find_audits
end
def load_user
@auditable = User.find(params[:user_id])
end
def load_client
@associated = Client.find(params[:client_id])
end
def find_audits
if @auditable
scope = @auditable.audits
elsif @associated
scope = Audited::Audit.where(associated_type: @associated.class.name, associated_id: @associated.id)
scope = scope.where(auditable_type: params[:auditable_type]) if params[:auditable_type]
end
scope.reorder("id DESC, version DESC")
end
【讨论】:
你能把控制器方法也贴在这里以上是关于在 Rails 中审计记录的主要内容,如果未能解决你的问题,请参考以下文章