3

最近几天我一直在尝试使用 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

然后,当我进行的更新影响的不仅仅是父模型时,我称之为它,它也会更新刚刚制作的子模型版本。

然后在我的 revert 方法中,我通过 params[:id] 找到版本,通过 parent_id params[:id] 找到所有子版本,并将它们全部具体化。这在一定程度上运作良好。

问题在于回调 - 我在模型上有一个回调,before_destroy,它修改了另一个模型。但是,在这种情况下,我不知道是用户发起了这个销毁还是其他模型,所以我无法获得 parent_id。也就是说,Employee有很多item,employee销毁item,items修改employee before_destroy。before_destroy 不知道它为什么被摧毁或是谁干的。

我知道 papertrail gem 已经说过它不能很好地与关联一起工作,但我觉得这一定是可能的 - 以某种方式查看回调可能吗?我可能对此过于深入,但是对于撤消起作用的操作,它非常好,我不想放弃它。

任何想法表示赞赏。谢谢!

4

0 回答 0