2015-11-05 45 views
1

我在我的數據庫中有一個記錄,其中有一個時間元素是一個存儲爲字符串的數字。 我想運行一個where查詢,我檢查數字是否大於x Activerecord query .where string as number

Recording.where("recording_duration_ms.to_i > 60000") 

當然它必須是簡單的事......

+2

爲什麼'recording_duration_ms'存儲爲一個字符串?修復你的模式而不是在它周圍解決問題不是更有意義嗎? –

+0

與@ muistooshort一起,你可以編寫一個遷移任務來獲取所有值,更改列類型(刪除和添加),然後插入字符串作爲整數。如果比現在看到的影響更大,我不會感到驚訝。從那裏你可以使用'Client.where(「recording_duration_to_ms>?」,60000)' –

+0

你應該將整數作爲整數存儲在數據庫中 –

回答

-2

PSQL存儲的一切作爲一個字符串,所以你需要大約60000單引號:

Recording.where(「recording_duration_ms.to_i>」 60000' 「)

(我認爲)

+0

(1)PostgreSQL不會將所有內容都存儲爲字符串。 (2)'.to_i'是一個Ruby方法調用,不是SQL。 (3)字符串比較不像數字比較那樣工作,例如「2」>「10」是真的。 –

3

大多數SQL數據庫允許你CAST值不同的數據類型。最有可能做你想要的查詢是:

Recording.where('CAST(recording_duration_ms AS INT) > 60000')

2

完善該@Alex Peachey給出了答案......

avoid SQL injection,你要爲使用?hash

Recording.where("CAST(recording_duration_ms AS INT) > ?", 60000)

Recording.where("CAST(recording_duration_ms AS INT) > :duration", duration: 60000)

+0

你是正確的SQL注入部分。除非你100%確定,否則千萬不要把變量放到查詢中。 – Hendrik

+0

儘管在構建查詢時避免SQL注入很好,但是由於'60000'不可變,所以沒有注入的可能性。如果它是可變的並且被插入,那麼肯定是避免注入。 –

+0

「檢查數字是否大於x」在問題中聽起來像一個變量,但我想你是正確的 - 該示例沒有包含變量。但無論如何,硬編碼查詢都很無聊。 :)今天它是60000,明天是另一回事。代碼應該能夠處理傳入參數中的值來查詢。 – Kalman

0

這適用於PostgreSQL的,至少

Recording.where('recording_duration_ms::int > ?', 60000)