Paper Trail:每当相关模型发生变化时,都会在父级上创建一个版本?

Dav*_*Ham 5 ruby-on-rails paper-trail-gem

我正在开发一个 Rails 应用程序,我需要在一个Record上显示审计跟踪,其中 has_many Data。我的 Record 上有 paper_trail 和相关的 Datum 模型,它可以很好地保存它们的版本。

但是,我需要的是,每当一个或多个关联数据发生更改时,都会为 Record 创建一个版本。目前,它在每个更改的 Datum 上创建版本,但只有在 Record 的属性更改时才会创建 Record 的版本;当关联的数据发生变化时,它不会这样做。

我尝试将 touch_with_version 放在 Record 的 after_touch 回调中,如下所示:

class Record < ActiveRecord::Base
  has_many :data

  has_paper_trail

  after_touch do |record|
    puts 'touched record'
    record.touch_with_version
  end

end
Run Code Online (Sandbox Code Playgroud)

class Datum < ActiveRecord::Base
  belongs_to :record, :touch => true

  has_paper_trail

end
Run Code Online (Sandbox Code Playgroud)

after_touch 回调触发,但不幸的是它为每个 Datum 创建了一个新版本,因此当创建一个 Record 时,它已经有 10 个版本,每个 Datum 一个。

有没有办法在回调中判断一个版本是否已经创建,所以我不创建多个?就像检查 Record 回调之一,如果 Datum 已经触发了一个版本,就不要再做了吗?

谢谢!

Tom*_*Tom 4

这对我有用。

class Place < ActiveRecord::Base
  has_paper_trail
  before_update :check_update

  def check_update
    return if changed_notably?

    tracking_has_many_associations = [ ... ]
    tracking_has_has_one_associations = [ ... ]

    tracking_has_many_associations.each do |a|
      send(a).each do |r|
        if r.send(:changed_notably?) || r.marked_for_destruction?
          self.touch
          return
        end
      end
    end
    tracking_has_one_associations.each do |a|
      r = send(a)
      if r.send(:changed_notably?) || r.marked_for_destruction?
        self.touch
        return
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)