2015-03-26 2 views
3

в paper_trail один из предостережений является то, что только первый уровень ассоциаций выздоровел, это проблема, если у вас есть ассоциации в пределах ассоциацийвосстановление ассоциаций в рамках ассоциаций при использовании papertrail

Если у меня есть ...

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 восстановить удаленные pointlog

это самый лучший способ для восстановления вложенные каскадные удаления, или есть лучший способ решить эту проблему в paper_trail?

ответ

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 
Смежные вопросы