1

モデルの特定のバージョンを注文とともに保存する必要があります。paper_trailvestal_versionsなどのバージョニング gem を使用する予定です。正しいバージョンが注文とともに自動的にロードされることを希望します。

理想的には、単にオブジェクトを保存しorder.update_attributes(:stuff => bought_stuff)、注文がそのバージョンを記憶して、その後の読み込みがorder.reload.stuff注文が保存されたときのオブジェクトのままになるようにします。

そのような機能を提供する宝石はありますか? 見つかりませんでした。

それ以外の場合、ActiveRecord とバージョニング gem を使用してそれを実現するにはどうすればよいですか?

4

2 に答える 2

3

実際、私は PaperTrail とこれで私が望むほとんどを達成することができました:

class Stuff < ActiveRecord::Base
  has_paper_trail
end

class Order < ActiveRecord::Base
  belongs_to :stuff

  def stuff_with_version
    stuff_without_version.version_at(created_at) if stuff_without_version
  end

  alias_method_chain :stuff, :version
end
于 2012-10-04T10:48:08.527 に答える
0

これが最適な設計であるとは限りませんが、これには paper_trail を使用できます。マクロ メソッド 'has_paper_trail' をモデル クラスの先頭に追加するだけで、インスタンスが変更されるたびに、そのシリアル化されたコピーが "versions" というテーブルに作成され、実際のモデルへのポリモーフィックな関係が作成されます。

「製品」の特定のバージョンを注文に関連付けたいと仮定すると、バージョン テーブルに関係を追加することから始めます。つまり、注文に「version_id」を追加する移行です。次に、次のように関係を設定します。

class Order
  belongs_to :version

  def product
    version
  end

  def product=(p)
    version=p.versions.last
  end

end

class Product
  has_paper_trail
end

これを使用して、製品を注文に追加すると、代わりに注文が製品の最新バージョンに関連付けられます。製品を取得すると、バージョンが抽出されます。つまり、注文を作成したときの製品です。関係を逆に機能させる (つまり、製品を注文に関連付ける) ことは、より複雑になる可能性がありますが、これは出発点です。

于 2012-10-04T10:55:12.317 に答える