Rails 3,PaperTrail和Whodunnit用户实例

时间:2014-01-14 22:16:58

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

我有一个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上的“user”方法?

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

1 个答案:

答案 0 :(得分:12)

自己找到答案。一切都基于子类化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: ...>