我需要用订单存储模型的特定版本。我打算使用像 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
使用此功能,当您将产品添加到订单时,它会将订单与产品的最新版本相关联。当您检索产品时,它将拉出版本;即您创建订单时的产品。让关系以相反的方式工作(即将产品与订单相关联)可能会更复杂,但这是一个开始。