2015-11-05 91 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)