2012-07-03 66 views

回答

176

試試這個

User.where("id > ?", 200) 
+0

同樣來自厄尼·米勒 – cpuguy83

+4

退房Squeel寶石是否有任何理由,更喜歡使用'',而?比內嵌'200'? – dukedave

+8

它會自動轉義200(如果用戶可以輸入值,它可以避免SQL注入攻擊的可能性) – user1051849

71

我只測試了Rails中4,但有使用範圍與where哈希獲得此行爲的有趣的方式。

User.where(id: 201..Float::INFINITY) 

將生成SQL

SELECT `users`.* FROM `users` WHERE (`users`.`id` >= 201) 

同樣可以爲小於與-Float::INFINITY來完成。

我剛剛發佈了一個類似的問題,詢問有關這樣做的日期爲here on SO

+0

這個答案是Rails 4 IMO的最佳選擇。已經使用它很長一段時間,並完美的作品。 –

+2

出於好奇,爲什麼這比被接受的答案更勝一籌? – mecampbellsoup

+4

優越是誤導。一般來說,如果您能夠在字符串上使用哈希語法,那麼您的ARel查詢將獲得更多靈活性,這就是爲什麼許多人會喜歡此解決方案。根據您的項目/團隊/組織,您可能希望某些人能夠更輕鬆地查看代碼,以瞭解接受的答案。 – Aaron

4

如果你想有一個更直觀的文字,它存在一個名爲squeel的寶石,將讓你寫你的指令是這樣的:

User.where{id > 200} 

注意「括號」字符{}和id僅僅是一個文本。

所有您需要做的是squeel添加到您的Gemfile:

gem "squeel" 

用Ruby編寫複雜的SQL語句時,這可能會緩解你的生活了很多。

+5

我建議避免使用squeel。長期難以維護,有時會有奇怪的行爲。此外,它與某些活動記錄版本的車錯 –

+0

我已經使用squeel一些年,仍然滿意。但也許值得去嘗試另一個ORM,比如續集(<> squeel),這看起來很有希望取代ActiveRecord。 – Douglas

16

一個更好的用法是在用戶模式來創建範圍where(arel_table[:id].gt(id))

0

短:

User.where("id > 200") 
+4

我認爲這必須是動態的,並且海報希望通過使用參數化查詢('where(「id>?」,200)'syntax)來避免SQL注入。這並沒有達到那個目標。 –