【问题标题】:Ruby On Rails help on Paper_trail gem关于 Paper_trail gem 的 Ruby On Rails 帮助
【发布时间】:2017-04-30 00:49:49
【问题描述】:

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

@versions = PaperTrail::Version.order('created_at')

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】: