我正在使用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/