我在我的数据库中有一个记录,其中有一个时间元素是一个存储为字符串的数字。 我想运行一个where查询,我检查数字是否大于x Activerecord query .where string as number
Recording.where("recording_duration_ms.to_i > 60000")
当然它必须是简单的事......
我在我的数据库中有一个记录,其中有一个时间元素是一个存储为字符串的数字。 我想运行一个where查询,我检查数字是否大于x Activerecord query .where string as number
Recording.where("recording_duration_ms.to_i > 60000")
当然它必须是简单的事......
PSQL存储的一切作为一个字符串,所以你需要大约60000单引号:
Recording.where(“recording_duration_ms.to_i>” 60000' “)
(我认为)
(1)PostgreSQL不会将所有内容都存储为字符串。 (2)'.to_i'是一个Ruby方法调用,不是SQL。 (3)字符串比较不像数字比较那样工作,例如“2”>“10”是真的。 –
大多数SQL数据库允许你CAST
值不同的数据类型。最有可能做你想要的查询是:
Recording.where('CAST(recording_duration_ms AS INT) > 60000')
完善该@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)
这适用于PostgreSQL的,至少
Recording.where('recording_duration_ms::int > ?', 60000)
为什么'recording_duration_ms'存储为一个字符串?修复你的模式而不是在它周围解决问题不是更有意义吗? –
与@ muistooshort一起,你可以编写一个迁移任务来获取所有值,更改列类型(删除和添加),然后插入字符串作为整数。如果比现在看到的影响更大,我不会感到惊讶。从那里你可以使用'Client.where(“recording_duration_to_ms>?”,60000)' –
你应该将整数作为整数存储在数据库中 –