我正在开发一个Rails应用程序,我需要在Record上显示审计跟踪,其中包含has_many数据.我的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
和
class Datum < ActiveRecord::Base
belongs_to :record, :touch => true
has_paper_trail
end
fire_touch回调触发,但不幸的是它为每个Datum创建了一个新版本,所以当创建一个Record时,它已经有10个版本,每个Datum一个版本.
有没有办法告诉回调函数是否已创建版本,所以我不创建倍数?比如检查一个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