5

PaperTrail によって制御されるバージョンを持つ City クラスがあります。私のシステムには、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 .: 私が行ったようにモデル 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

そして今、特定のバージョンのユーザーを呼び出すと、ユーザー whodnit インスタンスが返されます

City.first.versions.last.user
=> #<User id: 2, email: "xxxxxx@yyyyy.com", encrypted_password: ...>
于 2014-01-18T14:04:51.403 に答える