使用 PaperTrail,我可以为特定模型或属性选择退出“object_changes”吗?

Gab*_*ley 6 ruby ruby-on-rails paper-trail-gem

这与#837有点相关,因为我的模型上有一个大数据列,但是我认为我可能会得到与该问题中提出的相反的更好的服务 - 即维护对象列而不是 object_changes 列.

我们一直在没有versions.object_changes 列的情况下运行。现在我已经添加了这个列,我意识到我正在为 object_changes 中的数据列写入很多我不关心的数据 - 因为对数据的微小更改会导致它被有效地写出 3 倍(一次在前后object两次object_changes)。

我不认为跳过或忽略是我想要的,因为我确实希望对数据进行更改以生成新版本。

我应该走自定义版本模型路线吗?或者你有什么推荐?

Jar*_*eck 6

一些选项,按推荐的降序排列(最强烈推荐在前):

  1. version_limit(支持) - 通过限制您为给定记录创建的版本数,使用version_limit. (https://github.com/airblade/paper_trail#2e-limiting-the-number-of-versions-created)
  2. 自定义表(支持)- 自定义版本模型,没有object_changes列的自定义表。排除实验关联功能(track_associations必须是false[默认])
  3. Patch recordable_object_changes,方法 1(不支持)- 自定义版本模型,但仍在使用该versions表。覆盖#paper_trail以返回RecordTrail其覆盖的自定义子类RecordTrail#recordable_object_changes。覆盖这些方法会破坏您的保修。
  4. 补丁recordable_object_changes,方法 2(不支持) - 覆盖RecordTrail#recordable_object_changes,添加类检查条件。除了你想要破解的模型之外,所有的都调用 super 。覆盖此方法会破坏您的保修。
  5. 自定义序列(支持的,但不是这个) -自定义序列带班检查的条件,并告诉你是否是序列化的一些方法object_changes,而不是object。可能是个坏主意,看起来真的很hacky。

最后,我很乐意查看一个 PR,它添加了一个新功能,能够在每个模型的基础上配置哪些数据应该写入object_changes列。如果你认真对待这个问题,并看到它完成,请打开一个新问题,以便我们可以进一步讨论。有几种不同的设计可以工作。

2019 年更新:我们现在有object_changes_adapter它仅适用于专家用户,可能不是我的最佳推荐。