【发布时间】:2015-11-17 12:05:21
【问题描述】:
在 Rails 3.2 应用程序中,我有一个 Tag 模型,并希望查找 name:string 字段中的值为全部小写的所有记录。
因此,activerecord 查询(在 Postgres 上)将返回 Tag(id: 1, name: 'test') 而不是 Tag(id:2, name: 'Test')。
我确信有一种简单的方法可以做到这一点,但我无法生成有效的查询!
【问题讨论】:
-
感谢 ROR 开发人员,但我所追求的是所有
Tags的names只有小写字母,即 'test'、'banana'、'ror developer' 而不是 '测试”、“香蕉”或“ROR 开发人员”。 -
这两个答案有细微的差别,你应该清楚你想要的是所有列的值与其小写表示相同的行,还是列的值没有小写字母以外的字符。
-
是的,非常正确大卫。两者都可以接受,尽管我最理想的做法是 exclude 名称包含任何大写字符的标签。但最后我根据 Brad 的回答确定了一个正则表达式查询,然后做了相反的事情,
regex: '^[a-z0-9]+$'查找名称仅包含数字和小写字母的标签,因为这返回了更少的不相关查询。奇怪的是,“正则表达式方式”不仅更加灵活,而且在生产中实际上快了一倍! -
性能可以通过正则表达式在到达不在所需集合中的字符时返回 false 来解释,这在字符串以大写字符开头时是最佳的。无需转换所有内容,然后与原始文件进行比较。
-
伟大的大卫。在数据库上运行一些统计数据显示,在 109,756 个当前标签中,99.17% 以大写字母开头。再次有趣的是,查询
Tag.where('name ~ :regex', regex: '^[A-Z]').count仍然比'^[a-z0-9]+$'正则表达式和计数长近 50%(即 100 毫秒对 70 毫秒),即使使用热 postgres 缓存。
标签: sql ruby-on-rails ruby-on-rails-3 postgresql activerecord