我想使用版本化的 ActiveRecord 关联。例如,我想找到另一个对象属于某个过去日期的对象,或者在此之前它属于的对象。是否已经存在一个库子类化 Rails 的 ActiveRecord 以提供版本关系?或者其他一些提供持久版本关系的 Ruby 库?
3 回答
试试ActsAsVersioned插件
如果您不处理大量数据,并且额外的时间维度不会将您的数据库推到边缘,那么历史版本化数据没有重大缺点。额外的查询复杂性可能会有点痛苦,但这并不是什么大问题。
就我而言,我编写了一个处理版本控制的 rails 插件,它为每个版本控制表添加了 5 列(并帮助处理查询/操作等):
valid_from - datetime - 创建此版本的日期时间
valid_to - datetime - 此版本停止有效的日期时间
root_id - 整数 - 原始行的 id(这是后续版本)
created_by - 整数 - 执行创建此版本的用户的用户 ID
reserved_by - 整数 - 停用此版本的用户的用户 ID
对于当前活动的行,valid_to 为空。在 valid_to 上添加索引有助于保持性能快速。
在事务性应用程序中支持历史状态是大规模扩展复杂性、降低数据库性能和让自己生活困难的好方法。如果您只需要显示或报告历史状态而不需要它,请考虑构建一个具有Type-II 缓慢变化维度和更新它的周期性过程的星型模式。
这将比使用通过代码库运行的系统临时历史跟踪构建应用程序复杂得多。如果这种方法可以满足您对应用程序的要求,那么您可能会做得更好。这也意味着应用程序数据库将与系统附带的普通数据库访问机制很好地配合使用。
如果您需要相当频繁的刷新,您可以在数据库上实现更改数据捕获系统,如果应用程序只需要关注当前状态,这相对简单。使用 CDC 机制,加载过程只需根据更改进行更新,并且运行速度相对较快。