5

我有一个 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,但我没有想出另一个方向。

4

1 回答 1

13

自己找到了答案。一切都基于对 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: ...>
于 2014-01-18T14:04:51.403 回答