2014-01-14 24 views
5

私はPaperTrailによって制御されるバージョンを持つCityクラスを持っています。私のシステムにはDeviseによって管理されているユーザーがいます。私はCityクラスの特定のバージョンを編集したユーザーとの関係を持っていたいと思います。Rails 3、PaperTrail and Whodunnitユーザーインスタンス

これにより
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 

私は、たとえば、特定のユーザーによって行われた版を持つことができます:

をので、私はRailsの3.2.15およびペーパー・トレイル3.0.0を使用して、以下の設定を試してみました行うに

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を作成する必要があるかどうかはわかりませんが、その方向で別の方法を見つけられませんでした。

答えて

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

完璧を返します。私の作業構成があります!これはデフォルトではペパーレールで働いている必要があります! – Flezcano

+1

paper_trailのv4.0.0.beta2で、 'has_paper_trail:class_name => 'バージョン'は' has_paper_trail'の後にカンマなしで動作します。 – Nobu