2014-01-24 92 views
2

我知道可以在Rails模型中創建一個default_scope來限制選擇。但是,這可以/將會被無所謂的呼叫覆蓋。Rails必需範圍

是否有可能有一個默認應用的範圍,而不管Rails範圍方法如何?初始化方法可以做些什麼?

+0

這沒有任何意義。如果範圍是「強制性的」,以至於無法規避它,那麼您可能需要重新考慮如何構建數據。 – meagar

+0

我知道它在正常情況下沒有意義。我試着選擇模擬多重繼承,或者類似的東西。 –

回答

2

是的,你可以猴子補丁ActiveRecord :: Base方法。

見無範圍的方法:

def unscoped #:nodoc: 
    block_given? ? relation.scoping { yield } : relation 
end 

你應該猴補丁#relation方法,包括默認的範圍。

放置在config/initializers目錄中的下列文件:

module ActiveRecord 

    class Base 

    def relation 
     base_relation = super 
     base_relation.where(#default conditions) 
    end 
    end 
end 

您還可以使用的ActiveSupport ::關注這可能是首選的方式,我只是想指出的是您應該擴展#relation方法。無論您採用哪種方式擴展ActiveRecord,我的建議是您應該堅持使用#default_scope方法並編寫必要的測試以確保關係不被縮小。