过去几天我一直在尝试使用paper_trail作为撤销系统,其中可以同时回滚多个对象;我从Railscast开始,一直在努力让自己有所作为。我觉得我很接近,但也觉得我的实施可能会更好,或者可能有一种我不了解的或者超出我的技能的不同方式。
到目前为止,我已经尝试过这个:
在版本中添加了parent_id列。这包含另一个版本id。
创建了一个设置此ID的方法,在执行保存,更新或删除后,我传递父模型和子模型,然后使用父项最新版本ID更新子项最新版本的parent_id。它看起来像这样:
def set_parent_to_version(parent, child)
child.versions.last.update_attributes(:parent_id => parent.versions.last.id)
end
然后,当我进行的更新影响的不仅仅是父模型时,我会调用它并且它也会更新刚制作的子模型版本。
在我的恢复方法中,然后我通过params [:id]找到版本,并通过parent_id params [:id]找到所有子项,然后将它们全部重新启用。这在一定程度上起作用。
问题在于回调 - 我在模型上有一个回调,在before_destroy之前,它修改了另一个模型。但是,在这种情况下,我不知道用户是否发起了此破坏或不同的模型,因此我无法获取parent_id。换句话说,员工有很多项目,员工销毁项目,项目修改员工before_destroy。 before_destroy不知道它为什么被销毁或是谁做了。
我知道papertrail gem已经说过它与关联不起作用,但我觉得这一定是可能的 - 不知怎么看待回调呢?我可能在这方面做得太深,但是对于撤销工作的动作,它非常好,我不想放弃它。
任何想法都赞赏。谢谢!