在 Papertrail 中设置每个模型的版本限制?

Set version limit per model in Papertrail?

有没有办法在 Papertrail 中限制每个模型的版本数量?

例如,我知道我可以使用

设置全局限制
PaperTrail.config.version_limit = 3

但我没有找到一种方法来设置每个模型,比如

class Article < ActiveRecord::Base
  has_paper_trail :limit => [10]
end

我也不想只限制保存的版本数量(比如十个),而是只保存最新的十个版本(与 config 版本设置相同)。

考虑使用 if: 语法有选择地关闭文件跟踪:

has_paper_trail :if => Proc.new { |model| model.versions.count > 10 }

来自文档的细节:https://github.com/airblade/paper_trail#choosing-when-to-save-new-versions

这里有你想要的答案:

将常量 "PAPER_TRAIL_VERSION_LIMIT" 添加到您的 Article 模型中,如下所示

# models/article.rb
class Article < ActiveRecord::Base
  has_paper_trail
  # 10 mean you article will have 11 version include 'create' version
  PAPER_TRAIL_VERSION_LIMIT = 10
end

将以下代码添加到 PaperTrail 配置文件的底部

# /config/initializers/paper_trail.rb
module PaperTrail
  class Version < ActiveRecord::Base
    private
    def enforce_version_limit!
      limit = PaperTrail.config.version_limit
      # This is the key custom line
      limit = item.class::PAPER_TRAIL_VERSION_LIMIT  if item.class.const_defined?("PAPER_TRAIL_VERSION_LIMIT")
      return unless limit.is_a? Numeric
      previous_versions = sibling_versions.not_creates
      return unless previous_versions.size > limit
      excess_versions = previous_versions - previous_versions.last(limit)
      excess_versions.map(&:destroy)
    end
  end
end

尽情享受吧! :D

添加以下初始化程序:

# /config/initializers/paper_trail.rb
module PaperTrail
  module VersionConcern
    private

    def enforce_version_limit!
      limit = defined?(version_limit) ? version_limit : PaperTrail.config.version_limit
      return unless limit.is_a? Numeric
      previous_versions = sibling_versions.not_creates
      return unless previous_versions.size > limit
      excess_versions = previous_versions - previous_versions.last(limit)
      excess_versions.map(&:destroy)
    end
  end
end

然后您可以简单地在您想要为其指定替代限制的任何模型中定义 version_limit

def version_limit
  20
end

至于 Paper Trail 11.0.0,开箱即用地限制了 gem 支持的创建版本数量: https://github.com/paper-trail-gem/paper_trail#2e-limiting-the-number-of-versions-created

例如:

# At most 3 versions (2 updates, 1 create). Overrides global version_limit.
has_paper_trail limit: 2