我正在使用Rails应用程序,需要在记录上显示审计跟踪,该记录具有has_many 数据。我在Record和相关的Datum模型上有paper_trail,并且可以很好地保存它们的版本。

但是,我需要的是一个版本用于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都有一个版本。

有没有办法在回调中告诉您是否已创建一个版本,所以我不创建多个版本?就像 checkin 一个Record回调中一样,如果Datum已经触发了一个版本,就不做其他事情了吗?

谢谢!

最佳答案

这对我有用。

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

关于ruby-on-rails - Paper Trail : create a version on parent whenever associated model changes?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33043447/

10-13 07:02