【发布时间】:2013-11-21 00:25:12
【问题描述】:
我正在尝试将 Ruby 1.9.3 应用程序升级到 2.0,除了一个小问题,一切似乎都很顺利。我编写了一个模块,将其包含在我的模型中以覆盖 activerecord 破坏。它将现有的destroy 方法别名为destroy!,然后覆盖destroy 以更改记录上的deleted_at 时间戳。只有当我升级到 ruby 2.0 destroy! 不再破坏记录,但行为就像我的新覆盖方法一样。知道为什么会这样吗?更相关的代码部分如下。完整要点here.
def self.included(base)
base.class_eval do
alias_method :destroy!, :destroy
alias_method :delete!, :delete
default_scope -> { where(:deleted_at => nil) }
end
base.send :extend, ClassMethods
base.send :include, InstanceMethods
end
【问题讨论】:
-
这是解决您最初问题的一种非常糟糕的方法。覆盖核心方法(如销毁或删除)将导致您和任何其他从事此工作的开发人员非常头疼...我建议使用类似
update_deleted_at的方法(这实际上是您正在做的)而不是覆盖destroy方法。仅仅因为你可以用 ruby 覆盖某些东西,并不意味着你应该... -
我同意@tyler 的观点,我想不出一个令人信服的理由,这样可以节省比维护它所浪费的时间更多的时间。
-
虽然我可以理解这种情绪,但我的目标不是节省时间,而是防止意外删除数据并使其对外部用户透明。我肯定会继续修改我的解决方案,但如果只是出于好奇,您对我的问题有答案吗?
标签: ruby-on-rails ruby activerecord ruby-2.0