我正在尝试在rails中滚动自己的归档,但是在覆盖它之前我无法弄清楚如何对旧destroy
方法进行别名。下面是我想要做的,但我得到NoMethodError
,因为在模块之前没有定义destroy
。如果我将它放在InstanceMethods
模块中,它的工作方式是我所期望的,但似乎已被弃用。我应该用香草模块处理它还是有办法用ActiveSupport::Concern
?
module Trashable
extend ActiveSupport::Concern
included do
default_scope where(deleted_at: nil)
end
module ClassMethods
def deleted
self.unscoped.where(self.arel_table[:deleted_at].not_eq(nil))
end
end
alias_method :destroy!, :destroy
def destroy
run_callbacks(:destroy) do
update_column(:deleted_at, Time.now)
end
end
end
答案 0 :(得分:0)
你混合了几件事。
1 - 在包含模块之前,在包含模块的类中确实不存在 。
长话以来,你的ORM gem可能会为你生成并包含destroy方法。
您可以使用ruby 2+ prepend确保在所有方法出现后显示模块。
2 - 你可以使用香草模块或ActiveSupport::Concern
,只要你得到你想要的东西并知道你在做什么。
ActiveSupport::Concern
的重点主要是管理模块层次结构。如果你有一个级别,我认为使用它没有意义。我认为将prepend
与ActiveSupport::Concern
混合不是一个好主意。
(毕竟,ActiveSupport::Concern
最终只是简单的香草模块。)
3 - 在保持旧方法的同时覆盖方法的推荐方法是使用alias_method_chain。
然后你将拥有一个destroy_without_archive方法,这将是一种旧方法(在你覆盖之前)。