belongs_to特定版本



我需要用订单存储模型的特定版本。我打算使用像 paper_trail 或 vestal_versions 这样的版本控制 gem。我希望订单自动加载正确的版本。

理想情况下,我只需将对象与order.update_attributes(:stuff => bought_stuff)一起存储,订单就会记住内容的版本,以便后续加载order.reload.stuff仍然是保存订单时的对象。

有没有可以提供这种功能的宝石?我找不到。

否则,如何使用活动记录和版本控制 gem 来实现这一点?

实际上,我几乎可以用 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

不确定这是否一定是最适合您的设计,但您可以使用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

使用此功能,当您将产品添加到订单时,它会将订单与产品的最新版本相关联。当您检索产品时,它将拉出版本;即您创建订单时的产品。让关系以相反的方式工作(即将产品与订单相关联)可能会更复杂,但这是一个开始。

相关内容

最新更新