2011-08-25 58 views
1

我on Rails的v3.0.9使用Ruby和我有在我的模型下面的代碼:Ruby on Rails如何使用「包含」驗證工作?

class User < ActiveRecord::Base 
    validates :users_role, 
    :inclusion => { 
     :in  => UserRole.all.map(&:role) 
    }, 
    :presence => true 
end 

當我瀏覽了相關的UserRole頁(也就是,當一個用戶對象實例參與一個頁面 - 例如,RoR傳統的「顯示」或「索引」視圖),並檢查日誌文件,我發現UserRole SQL查詢已執行。也就是說,UserRole.all.map(&:role)運行。

我想知道Ruby on Rails如何適用於上述情況。它關係到性能?惰性加載UserRole.all.map(&:role)

+0

可能的重複http://stackoverflow.com/questions/5040661/rails-3-model-validation-inclusion-in-does-not-work – Awea

+1

@Awea這可能是這個問題的重複?被引用的問題詢問有關驗證不起作用,這個說明每次驗證運行時都會觸發查詢。 – rubish

回答

0

在您的開發環境中,您可能會看到在驗證用戶的任何請求上運行的查詢,因爲代碼將在每個請求上重新加載。在生產模式下嘗試一次,在這種情況下不應該發生,因爲代碼只加載一次,並且您沒有將查詢放入lambda表達式中。這裏不應該延遲加載,因爲您已經在結果集上調用了map

+0

謝謝,所以在生產模式下,SQL查詢不會發生......好!但是,如果我不調用'map'方法,查詢將被延遲加載或不加載? – Backo

+0

在這種情況下,應該延遲加載,但在這種情況下不需要延遲加載。 – rubish