【问题标题】:Rails - Override Alias methodRails - 覆盖别名方法
【发布时间】:2016-12-08 09:29:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    book.method(:destroy).super_method.call
    

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

    【讨论】:

      【解决方案2】:

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

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

      现在您可以调用 book.ar_destroy 来调用 AR 的 destroy 实现。不过,去掉别名会是更好的解决方案。

      【讨论】:

      • 我想出了 dataset.run_callbacks(:destroy);数据集。删除! .但是更喜欢你的答案。摆脱别名 ..hmm 我知道 - 虽然是非常乏味的任务 - 不知道应用程序的进出。无论如何,非常感谢!
      • 关于“轻松”的好补充:)
      • @Ilya:是的,看到你的答案后添加它:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多