2016-01-28 3 views
7

paper_trailの宝石はバージョンを追跡し、うまく機能します。しかし、私が気付いていた1つのエッジケースがあります。ほとんどのオブジェクトでは、ログインしている場合にアプリケーションコントローラがwhodunnitを設定し、そのセッション中に作成されたすべてのオブジェクトには、ログインしている人物に応じて「whodunnit」というバージョンが記録されます。新しいユーザーを作成するときにpaper_trailにwhodunnitを設定するにはどうすればよいですか?

興味深いのは、新しいユーザーがサインアップしているためにログインしています。ユーザーは、実際にはユーザー自身で作成されたため、間違った「なし」で作成されます。

もちろん、ユーザーレコードが保存される前にwhodunnitがユーザーのIDを知ることはできません。私はこれを知っている。

しかし、さまざまなバッチジョブでユーザーレコードが変更され、Webセッションには参加しないため、後で競合が発生し、バージョンが無制限のレコードでも作成されます。

ここでは、誰がそのユーザーを作成したのかを知ることができません。一部のバッチインポートプロセスまたはユーザーです。

私は、そのオブジェクトのPapertrail :: Versionsテーブルの周りをうかがい、whodunnitを修正するなど、さまざまな解決策を熟考していますが、それはかなり汚れているようです。

アドバイスはありますか?

答えて

1

コントローラ上の作成アクションで強制的に実行することができます。

before_filter :only => [:create] do 
    PaperTrail.whodunnit = "Public User" 
end 

バージョンテーブル内のユーザIDを持つことを主張した場合、あなたはこれを行うことができます。

ActiveRecord::Base.transaction do 
    @user.save! 
    @user.versions.first.update_attributes(:whodunnit => @user.id) 
end 
関連する問題