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 方法而不是别名。这是一个快速修复,但我建议重构您的代码。
这是一段臭代码,很多地方都使用了别名方法。现在我想调用 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 方法而不是别名。这是一个快速修复,但我建议重构您的代码。