Chr*_*art 10 ruby activerecord ruby-on-rails
我有一个应用程序,我想覆盖我的许多模型的破坏行为.用例是用户可能有合法需要删除特定记录,但实际上从数据库中删除该行会破坏影响其他相关模型的参照完整性.例如,系统的用户可能想要删除与他们不再开展业务的客户,但需要维护与该客户的交易.
看来我至少有两个选择:
我错过了一个更好的方法吗?
选项1对我来说似乎是一个可怕的想法,尽管我喜欢听到相反的论点.
选项2似乎有些Rails-ish但我想知道处理它的最佳方法.我应该创建自己的继承自ActiveRecord :: Base的父类,重写那里的destroy方法,然后从我想要这种行为的模型中继承该类吗?我是否还应该覆盖查找器行为,因此默认情况下不会返回标记为已删除的记录?
如果我这样做,我将如何处理动态查找器?命名范围怎么样?
如果您实际上并不想再次查看这些记录,但只关心在销毁父项时子项仍然存在,则工作很简单:添加:dependent => :nullify到has_many调用以NULL在销毁时自动设置对父项的引用,并教导查看处理缺少的引用.但是,这只有在您没有再看到该行的情况下才有效,即查看这些交易在公司名称下显示"[NO LONGER EXISTS]".
如果你不希望再看到这些数据,这听起来像你想要什么无关,与实际销毁的记录,这意味着你将永远不需要再次提及他们.隐藏似乎是要走的路.
因为你实际上并没有破坏记录,所以不会hide像你建议的那样将你的行为放在触发标志的方法中,而不是覆盖破坏.
从那里,只要您想列出这些记录并且只包含可见记录,一个简单的解决方案就是包括一个visible不包含隐藏记录的范围,并且当您想要再次找到该特定的隐藏记录时不包括它.另一条路径是用来default_scope隐藏隐藏的记录并Model.with_exclusive_scope { find(id) }用来提取一个隐藏的记录,但我建议不要这样做,因为它对于一个新来的开发人员来说可能是一个严重的问题,并且从根本上改变了什么Model.all回归根本没有反映出什么方法调用建议.
我理解让控制器看起来像Rails方式做事的愿望,但是当你没有真正按照Rails的方式做事时,最好明确一点,特别是当它真的不那么痛苦的时候这样做.
我为这个确切的目的写了一个插件,称为偏执狂.我从acts_as_paranoid "借用"了这个想法,并且基本上使用更少的代码重写了AAP.
当您呼叫destroy记录时,它实际上并不删除它.相反,它会将deleted_at数据库中的列设置为当前时间.
GitHub页面上的README应该有助于安装和使用.如果不是,请告诉我,我会看看能否为您解决这个问题.
| 归档时间: |
|
| 查看次数: |
5440 次 |
| 最近记录: |