使用papertrail时恢复关联内的关联

时间:2015-03-26 16:25:58

标签: ruby-on-rails-4 associations has-many paper-trail-gem

在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中的这一警告?

1 个答案:

答案 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