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 回答