Rails + ActiveRecord + Postgres:如何匹配不区分大小写的子字符串?

时间:2013-10-10 15:22:26

标签: ruby-on-rails postgresql activerecord

我必须查找来自User模型的所有具有子串“cpg”的电子邮件。所以它匹配“cpg@yahoo.com”,“cpg3333 @ yahoo.com”等

我很确定如何不区分大小写(使用User.where("lower(email)...")但我不知道如何找到子字符串。

我正在使用Rails 3 + Postgres 9.x

4 个答案:

答案 0 :(得分:13)

Rails中没有任何东西可以使用PostgreSQL的ilike(不区分大小写的函数)。

像这样:User.where("email ilike '%cpg%'")

答案 1 :(得分:8)

如果您不想在每次搜索电子邮件字段时始终记得在Ruby中输入lower(email)(和input.downcase),则可以{{ 1}}列本身通过使用email数据类型不区分大小。

这就是我刚才所做的。我创建了这样的迁移:

citext

现在我不再需要做任何额外的努力来使查询不区分大小写!它现在在幕后自动处理。

这使用PostgreSQL的citext扩展名。

http://www.sfcgeorge.co.uk/posts/2013/11/12/case-insensitive-usernames-with-postgres有一篇很好的文章。

答案 2 :(得分:6)

答案 3 :(得分:1)

选项1:

User.where('LOWER(email) = LOWER(?)', search_email)

选项2: 使用Postgres'citex扩展名为你做(如上所述)。