【问题标题】:Rails 3, PaperTrail and Whodunnit User InstanceRails 3、PaperTrail 和 Whodunnit 用户实例
【发布时间】:2014-01-14 22:16:58
【问题描述】:

我有一个 City 类,它的版本由 PaperTrail 控制。我的系统有由 Devise 管理的用户。我想在编辑特定版本的 City 类的用户之间建立关系。

为此,我使用 Rails 3.2.15 和 Paper Trail 3.0.0 尝试了以下配置:

class City < ActiveRecord::Base
  has_paper_trail
end

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

class PaperTrail::Version < ActiveRecord::Base
  belongs_to :user
end

有了这个我可以得到特定用户制作的版本,例如:

User.last.editions 获取最后一个用户的版本列表(PaperTrail::Version 对象)。

然后我认为拥有编辑特定城市的用户的实例会很简单,例如,获取编辑的用户的用户实例第一个城市的最后一个版本:

# NoMethodError: undefined method `user' for #<PaperTrail::Version:0x000000051d0da8>
City.first.versions.last.user

如果不是这样,我应该如何配置我的模型以访问 PaperTrail::Version 上的“用户”方法?

Ps.:我不确定我是否应该像我一样创建一个 Model PaperTrail::Version,但我没有想出另一个方向。

【问题讨论】:

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


    【解决方案1】:

    自己找到了答案。一切都基于对 PaperTrail::Version 进行子类化并使用 :class_name 选项。我的工作配置是:

    class City < ActiveRecord::Base
      has_paper_trail, :class_name => 'Version'
    end
    
    class User < ActiveRecord::Base
      has_many :editions, :foreign_key => 'whodunnit', :class_name => "Version"
    end
    
    class Version < PaperTrail::Version
      belongs_to :user, :foreign_key => 'whodunnit'
    end
    

    现在当调用特定版本的用户时,它会返回用户 whodunnit 实例

    City.first.versions.last.user
    => #<User id: 2, email: "xxxxxx@yyyyy.com", encrypted_password: ...>
    

    【讨论】:

    • 完美!默认情况下,这必须在 papertrail 中工作!
    • 在 paper_trail 的 v4.0.0.beta2 中,has_paper_trail :class_name =&gt; 'Version'has_paper_trail 之后不带逗号。
    • 我必须另外将它添加到 City 模型中:has_paper_trail versions: { class_name: 'Version' }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多