Ruby On Rails帮助Paper_trail gem

时间:2016-12-14 15:55:25

标签: ruby-on-rails paper-trail-gem

所以我有一个项目,包括用户身份验证和某些模型的历史记录跟踪。对于我使用paper_trail gem的历史记录,我有一个过滤历史记录以向用户显示的问题,我已将其配置为跟踪whodunnit字段中的current_user id。 我的用户有role_id,它指定Roles表中的角色 另外我有另一个表,其中包含一些具有id和user_id字段的项目。现在我的问题是如何根据用户的角色从Versions表中获取特定的行,比如ex:如果用户角色是' SomeRole'它必须只返回具有相同角色的用户所做的那些操作' SomeRole'。

我知道我可以采取所有行动
jmap -F -dump:live,format=b,file=<file_name.hprof> <process_id>

但不知道如何过滤以仅选择那些令我满意的用途。有没有一种简单的方法可以做到这一点,或者我应该像逐个选择一样硬编码,而不是检查他们角色的所有user_id等等?希望你理解我凌乱的解释方式

1 个答案:

答案 0 :(得分:0)

在类似的情况下,我使用了这个解决方案:

1)在版本

中添加了user_id字段
class AddUserIdToVersions < ActiveRecord::Migration
  def change
    add_column :versions, :user_id, :integer
    add_index :versions, :user_id
  end
end

(whodunnit是一个文本字段,我不想将它用作关联键)

2)版本模型中定义的关联:

# /app/models/version.rb

class Version < PaperTrail::Version
  belongs_to :user

  # ... some other custom methods
end

并在用户模型中:

 has_many :versions

3)在ApplicationController中(或您需要的地方)设置info_for_paper_trail

  def info_for_paper_trail
    { user_id: current_user.try(:id) } if user_signed_in?
  end

所以我可以访问以下版本:

@user.versions

所以在你的情况下,它将是:

Version.joins(:user).where(users: { role: 'SomeRole' })