2011-01-23 32 views
1

在Ruby中的查詢上我想在模型的的has_many領域查詢軌3如下:不是RoR中

@project.items.where(:status => 1)

問題是我想要得到確切的結果相反比這個。我想要的是@project所有項目的狀態是而不是 1.一直在尋找這個答案嗎?

回答

3

有許多方法可以完成你正在嘗試做的事情,但是,有些方法比其他方法更好。如果你將永遠尋找一個硬編碼的數量(即1在這種情況下),那麼下面的解決方案將工作:

@project.items.where('status != 1') 

然而,如果這個值不是硬編碼的,你是公然容易SQL注入作爲Rails不會(不能)轉義這種查詢。其結果是,它是其中Rails開發者首選用戶對於大多數自定義條件的語法如下(那些無法通過Hash構造):

@project.items.where(['status != ?', 1]) 

此語法略顯混亂,所以讓我去在它。基本上你提供了where子句和一個Array的值。數組中的第一個值是String,表示要執行的查詢。任何你想要在該字符串中獲得價值的地方,都可以放置一個?。這充當佔位符。接下來,您在每個問號中添加一個的元素。例如,如果我有以下內容:

where(['first_name = ? AND last_name = ?', params[:first_name], params[:last_name]] 

Rails會自動將這些匹配起來形成查詢。在這個過程中,它也會逃避潛在的不安全角色,防止注射。

一般來說,最好使用Array語法,即使是硬編碼值也是如此。我被告知,Rails 3.5中的純字符串條件會引發警告(未驗證),所以現在使用Array語法的過程並沒有什麼壞處。

+1

@nayish - 我完全重寫了我的答案,爲您提供更好的解釋 – sethvargo 2011-01-23 03:33:14