2013-03-20 70 views
1

我想知道我是否可以將default_scope放在if區塊內。我有一個用戶模型has_one配置文件。這是我在我的用戶模型的代碼:default_scope可以在if塊內嗎?

Class User 

default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false) 

end 

的問題是,當數據庫沒有創建的配置它提供了一個錯誤,因爲配置文件是零。我可以使用一個if塊,我可以說:

unless self.profile.nil? 
default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false) 
end 

這種方法是否有其他替代方法?

+0

這個問題不在'default_scope'中,它在你的代碼中的其他地方。即使你在db中沒有任何配置文件,也不應該導致任何錯誤。 – jvnill 2013-03-20 15:49:40

+0

作用域是在類級別 – apneadiving 2013-03-20 15:51:44

+0

好的,不管是否有任何配置文件在數據庫或不。如果我在我的用戶模型中有上述代碼,它會與Devise發生衝突。具體設計可確定。確認後,它不會直接進入用戶顯示頁面。我想我提供了足夠的信息。但任何人遇到這個問題? – pratski 2013-03-20 16:28:40

回答

1

雖然我在你已經解決了你的問題的意見看,這裏有一個答案,你實際上問的問題,萬一別人遇到這種奇事:

從技術上說,是的,你可以把在if區塊內呼叫default_scope但是,這個條件會被測試(並且default_scope應用與否)當這個類被加載時。當您啓動應用程序時(或者在開發模式下發送請求時)。您將無法檢查該類的特定實例的屬性,因爲該實例尚不存在。

簡版:a default_scope將適用於基於模型的所有查詢,或者不適用於所有查詢。

0

我敢肯定,你可以做這樣的事情:

default_scope lambda { 
    unless profile.nil? 
    joins(:profile).order('profiles.updated_at DESC').readonly(false) 
    end 
} 

下面是從spree_landlord項目an example

相關問題