Ruby 关于 Rails 帮助 Paper_trail gem

Ruby On Rails help on Paper_trail gem

所以我有一个项目,可以对用户进行身份验证,并对某些模型进行历史跟踪。对于我使用 paper_trail gem 的历史记录,我在过滤历史记录以显示给用户时遇到问题,我已将其配置为跟踪 current_user id 到 Whodunnit 字段中。 我的用户有 role_id,它指定角色 table 中的角色 我还有另一个 table,其中一些项目具有 id 和 user_id 字段。现在我的问题是如何根据用户的角色从版本 table 中获取特定的行,例如:如果用户角色是 'SomeRole' 它必须 return 只有那些完成的操作由具有相同角色的用户 'SomeRole'。 我知道我可以通过

完成所有操作
@versions = PaperTrail::Version.order('created_at')

但不知道如何筛选出 select 只有满足我的使用需求的那些。有没有一种简单的方法可以做到这一点,或者我应该像 select 一样对它进行硬编码,而不是检查所有 user_id 他们的角色等等?希望你能理解我乱七八糟的解释方式

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

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' })