我如何使用ActiveSupport :: Concern进行alias_method?

时间:2013-09-18 01:31:10

标签: ruby-on-rails activesupport

我正在尝试在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

1 个答案:

答案 0 :(得分:0)

你混合了几件事。

1 - 在包含模块之前,在包含模块的类中确实不存在

长话以来,你的ORM gem可能会为你生成并包含destroy方法。

您可以使用ruby 2+ prepend确保在所有方法出现后显示模块。

2 - 你可以使用香草模块或ActiveSupport::Concern,只要你得到你想要的东西并知道你在做什么。

ActiveSupport::Concern的重点主要是管理模块层次结构。如果你有一个级别,我认为使用它没有意义。我认为将prependActiveSupport::Concern混合不是一个好主意。

(毕竟,ActiveSupport::Concern最终只是简单的香草模块。)

3 - 在保持旧方法的同时覆盖方法的推荐方法是使用alias_method_chain

然后你将拥有一个destroy_without_archive方法,这将是一种旧方法(在你覆盖之前)。