2014-01-14 31 views
5

我有一個城市類,其版本由PaperTrail控制。我的系統有由Devise管理的用戶。我希望在編輯城市類的特定版本的用戶之間建立關係。Rails 3,PaperTrail和Whodunnit用戶實例

爲此我曾嘗試用Rails 3.2.15和紙徑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 Paper Trail :: Version,但我沒有找到另一種方法。

回答

11

我自己找到了答案。一切都基於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: "[email protected]", encrypted_password: ...> 
+0

完美!默認情況下,這必須在papertrail中工作! – Flezcano

+1

在paper_trail的v4.0.0.beta2上,'has_paper_trail:class_name =>'Version''在'has_paper_trail'之後沒有逗號。 – Nobu