2016-12-08 90 views
0

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

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

回答

1

这是试图实施偏执狂模式,我猜。臭臭的代码,的确如此。它会覆盖destroy方法,您不能再调用原始实现(很容易)。但是你可以保存原来的实现!现在

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

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

+0

我想出了dataset.run_callbacks(:destroy); dataset.delete! 。然而,更喜欢你的答案。摆脱别名..hmm我知道 - 虽然非常乏味的任务 - 不知道应用程序的进出。 Anyhows非常感谢! –

+0

很好的补充关于'容易':) – Ilya

+0

@伊利亚:是的,看到你的答案后添加它:) –

2

如果你有红宝石> = 2.2,则可以使用Method#super_method

book.method(:destroy).super_method.call 

在这种情况下,你会打电话给AR方法,而不是别名。这是一个快速修复,但我建议重构你的代码。