Rails - 覆盖别名方法

时间:2016-12-08 09:29:33

标签: ruby-on-rails ruby ruby-on-rails-3.1

这是一个有臭味的代码,别名方法已在很多地方使用过。现在我想调用实际的rails .destory方法,从而删除书籍的所有关联依赖项 - 有没有办法可以忽略别名方法并调用.destory AR方法?

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

2 个答案:

答案 0 :(得分:3)

如果你有Ruby&gt; = 2.2,你可以使用Method#super_method

book.method(:destroy).super_method.call

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

答案 1 :(得分:1)

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

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

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