0

バージョン管理したいさまざまなフィールドを含むwiki機能を備えた多言語Webサイトのモデルがありますが、一部の列に加えられた変更を元に戻す必要がありますが、他の列には戻す必要がありません。

たとえば、モデルインスタンスごとに英語版とスペイン語版のガイドを作成します。

想像:

  • ユーザーAがスペイン語ガイドを編集し、冒とく的な表現を追加します
  • ユーザーBは後で英語ガイドを編集し、役立つ変更を加えます。

通常、バージョン管理とは、ユーザーAが行った変更を元に戻すと、ユーザーBが後で行った変更も元に戻すことを意味しますが、私の場合、これらは2つの別個の懸念事項です。

したがって、基本的にスコープ付きのバージョン履歴が必要です。たとえば、papertrailを使用します。

#guide.rb
has_paper_trail :only => [:en_title, :en_body]
has_paper_trail :only => [:es_title, :es_body]

これに対する最も簡単な解決策はありますか?これを達成するためだけに、ガイドを1対1の関係を持つ別々のモデルに移動したくありません。

4

1 に答える 1

1

これを回避するために、私は個人的に翻訳を独自のモデルに抽出しますが、あまり巧妙な操作をしなくてもこれを達成できるはずです。

PaperTrail は、レコードが変更されるたびに新しい Version オブジェクトを作成します。object.versionsアレイを介してすべてのバージョンにアクセスできます。

元に戻したい属性と、元に戻したいバージョンを決定する方法を考え出す必要があります。これを取得したら、元に戻すことはそれほど難しくありません。

たとえば、モデルでは次のようになります。

# Arguments:
#   attr - Must respond to to_s with name of attribute to revert
#   ver  - Integer (e.g. -1 for previous version) or actual Version object
def revert_attribute(attr, ver)
  ver = self.versions[ver] if ver.class == Integer
  ver = ver.reify
  self.write_attribute( attr, ver.read_attribute(attr) )
  self.save
end

コードはテストも構文チェックもされていませんが、PaperTrail ソースで見たとおりに動作するはずです。

完全に統合されたソリューションではありませんが、ほとんどのニーズには十分対応できるはずです。

于 2011-06-28T21:47:15.423 に答える