Rails 3、PaperTrail和Whodunnit用户实例

5

我有一个城市类,其版本由PaperTrail控制。我的系统有被Devise管理的用户。我希望在城市类的特定版本和编辑此版本的用户之间建立关系。

为了实现这个目标,我尝试使用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"方法?
附注:我不确定是否应该像我所做的那样创建一个Model PaperTrail::Version,但我没有找到其他方向。
1个回答

14

我自己找到了答案。一切都基于对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

现在当调用特定版本的用户时,它会返回执行操作的用户实例

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

太好了!这应该默认在Papertrail中工作! - Flezcano
1
在 paper_trail 的 v4.0.0.beta2 版本中,has_paper_trail :class_name => 'Version' 可以不用在 has_paper_trail 后面加逗号。 - Nobu
我不得不额外在City模型中添加以下内容: has_paper_trail versions: { class_name: 'Version' } - FabienChn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接