Rails - 覆盖别名方法

Rails - Override Alias method

这是一段臭代码,很多地方都使用了别名方法。现在我想调用 actuals rails .destory 方法,从而删除 Books 的所有相关依赖项 - 有没有一种方法可以忽略别名方法并调用 .destory AR 方法?

class Books < ActiveRecord::Base
  def disable
    self.is_active = false
    save!
  end
  alias_method :destroy, :disable
end

我猜那是实施偏执狂模式的尝试。臭代码,确实。它覆盖了 destroy 方法,您不能再(轻松)调用原始实现。但是你可以保存原来的实现!

class Book < ActiveRecord::Base
  alias_method :ar_destroy, :destroy
  alias_method :destroy, :disable
end

现在您可以调用 book.ar_destroy 来调用 AR 的 destroy 实现。虽然,摆脱别名将是一个更好的解决方案。

如果你有 Ruby >= 2.2,你可以使用 Method#super_method:

book.method(:destroy).super_method.call

在这种情况下,您将调用 AR 方法而不是别名。这是一个快速修复,但我建议重构您的代码。