5

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

1 回答 1

0

你混合了几件事。

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

长话短说,你的 ORM gem 可能为你生成并包含了 destroy 方法。

您可以使用 ruby​​ 2+ prepend来确保您的模块在所有方法都存在之后出现。

ActiveSupport::Concern2 -只要你得到你想要的并且知道你在做什么,你就可以使用 vanilla 模块。

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

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

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

然后,您将有一个可用的 destroy_without_archive 方法,这将是旧的方法(在您覆盖它之前)。

于 2015-08-21T09:08:57.907 回答