【问题标题】:Using whodunnit to get User Instance使用 whodunnit 获取用户实例
【发布时间】:2014-02-18 21:16:20
【问题描述】:

在我的主页上,我使用 papertrail 显示最新更新。

控制器

@contributions = PaperTrail::Version.all.order("created_at DESC")

查看

<% @contributions.each do |v| %>
    <h2><%= v.item.name %><small>by </small></h2>
    <% v.changeset.each do |data| %>
      <h4><%= data %></h4>
    <% end %>
    <%= v.whodunnit %>
<% end %>

这里我得到了关联的用户,但只有 whodunnit 的 ID,但我想获取一个用户实例来获取 用户名。所以安装了 v.whodunnit 我想要 v.user.username。

我一直在查看similar question,但似乎无法找到一种方法来创建版本和用户之间的关系。

用户模型

class User < ActiveRecord::Base
  has_many :versions, :foreign_key => 'whodunnit', :class_name => "PaperTrail::Version"
end

版本型号

class Version < PaperTrail::Version
  belongs_to :user, :foreign_key => 'whodunnit'
end

编辑

当我看到 时我会得到这个

undefined method `user' for #<PaperTrail::Version:0x007fb24c08e868>

【问题讨论】:

  • 您当前的版本有什么问题?
  • 试图在我的视图中获取 v.user 时,我得到未定义的方法 'user'

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


【解决方案1】:

Rails 5.X 的更新版本

# config/initializers/paper_trail.rb
PaperTrail::Rails::Engine.eager_load!

module PaperTrail
  class Version < ::ActiveRecord::Base
    belongs_to :user, foreign_key: :whodunnit
  end
end

【讨论】:

    【解决方案2】:

    还有另一种方法:

    class Version < PaperTrail::Version
        ...
    
        def user
             User.find(whodunnit) if whodunnit
        end  
    end
    

    如果您需要将用户模型添加到 PaperTrail::Version 类本身,请向您的应用添加新的初始化程序:

    config/initializers/papertrail_monkey_patch.rb

    module PaperTrail
        class Version
            def user
                User.find(whodunnit) if whodunnit
            end
        end
    end
    

    【讨论】:

    • 当我尝试使用您的方法运行 时,我得到与上面相同的错误。 #<:version:0x007fb24c1d7eb8> 的未定义方法“用户”
    • 我想,我理解这个问题。您的v 变量属于PaperTrail::Version 类,而不是您的自定义Version。你需要猴子补丁PaperTrail::Version 类。
    • 好的,谢谢,知道我该怎么做吗?介意更新你的答案吗?
    【解决方案3】:

    您可以将关系添加到版本模型中

    config/initializers/paper_trail.rb

        # paper trail config ...
        # ...
    
        module PaperTrail
          class Version < ::ActiveRecord::Base
            belongs_to :user, foreign_key: :whodunnit
          end
        end
    

    【讨论】:

      【解决方案4】:

      添加模型

      class PaperTrailVersion < PaperTrail::Version
          belongs_to :user, foreign_key: :whodunnit
      end
      

      【讨论】:

        【解决方案5】:

        请参阅documentation 添加您自己的自定义版本模型:

        class UserVersion < PaperTrail::Version
          belongs_to :user, foreign_key: :whodunnit
        end
        

        然后在您要跟踪更改的类中指定自定义模型:

        class Contribution
          has_paper_trail versions: {class_name: 'UserVersion'}
        end
        

        如果您需要一次显示多个版本,这样做还可以让您预先加载关联的用户:

        Contribution.versions.includes(:user)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-25
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          • 2010-12-23
          • 2015-06-13
          • 2017-09-18
          相关资源
          最近更新 更多