Paper Trail:只要相关模型发生变化,就在父级上创建一个版本?

时间:2015-10-09 16:48:13

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

我正在开发一个Rails应用程序,我需要在记录上显示审计跟踪,其中has_many 数据。我的记录中有paper_trail,以及相关的Datum模型,它正在保存它们的版本。

但是,我需要的是,只要一个或多个相关数据发生更改,就会创建记录的一个版本。目前,它会在每个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

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

  has_paper_trail

end

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

有没有办法告诉回调是否已经创建了一个版本,所以我不创建多个?比如检查其中一个Record回调,如果Datum已经触发了一个版本,那么不要再做了吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这适合我。

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