在paper_trail中,其中一个警告是只恢复了第一级关联,如果你在关联中有关联,这就是一个问题
如果我有......
class Student < ActiveRecord::Base
has_paper_trail
has_many :attendances, dependent: :destroy
end
class Attendances < ActiveRecord::Base
has_paper_trail
has_many :point_logs, dependent: :destroy
end
class PointLogs < ActiveRecord::Base
has_paper_trail
end
如果我删除了学生,我会student.versions.last.reify(:has_many => true)
恢复已删除的考勤和学生,然后单独pointlog.version.last.reify
恢复已删除的积分
这是恢复嵌套级联删除的最佳方法,还是有更好的方法来解决paper_trail中的这一警告?
答案 0 :(得分:0)
所以这是一个可能的解决方案,它会更进一步。我有一个类似的问题,但希望它不是那么明确,因为它必须适用于多个模型。这是我创建的一个模块,我将其包含在版本链的顶层,因此在您的情况下,我会将其包含在Student中。
# This method finds the current reified model's has_many relationships and
# recursively reifies has_many relationships until the end
#
# @param [ActiveRecord::Base] model_version is a reified active_record model
# @return [ActiveRecord::Base] model_version
def self.reify_has_many_associations(model_version)
associations = model_version.class.reflect_on_all_associations(:has_many).select { |a| a.klass.paper_trail.enabled? }.map(&:name)
if associations.present?
associations.each do |a|
models = model_version.method(a).call
models.each do |m|
if m.version
m.version.reify(has_many: true)
::Revertable.reify_has_many_associations(m)
end
end
end
end
model_version
end