2016-12-08 138 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方法,而不是別名。這是一個快速修復,但我建議重構你的代碼。