在Papertrail中为每个型号设置版本限制?

时间:2016-04-06 15:31:07

标签: ruby-on-rails paper-trail-gem

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

例如,我知道我可以用

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

但我没有看到为每个模型设置的方法,例如

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

我也不想仅限制保存的版本数量(比如说十个),但只保留最后十个版本(与config版本设置相同)。

4 个答案:

答案 0 :(得分:6)

以下是您想要的答案:

将常量“PAPER_TRAIL_VERSION_LIMIT”添加到您的文章模型中,如下所示

# 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

答案 1 :(得分:1)

添加以下初始化程序:

# /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

答案 2 :(得分:0)

对于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

答案 3 :(得分:-1)

考虑使用if:语法有选择地关闭纸质记录:

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

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