我必须从User
模型中查找所有具有子字符串“cpg”的电子邮件。所以它将匹配“cpg@yahoo.com”、“cpg3333@yahoo.com”等
我很确定如何不区分大小写(使用User.where("lower(email)...")
但我不知道如何找到子字符串。
我正在使用 Rails 3 + Postgres 9.x
我必须从User
模型中查找所有具有子字符串“cpg”的电子邮件。所以它将匹配“cpg@yahoo.com”、“cpg3333@yahoo.com”等
我很确定如何不区分大小写(使用User.where("lower(email)...")
但我不知道如何找到子字符串。
我正在使用 Rails 3 + Postgres 9.x
在 Rails 中没有什么可以做的,你可以只使用 PostgreSQL 的ilike
(不区分大小写的函数)。
像这样:User.where("email ilike '%cpg%'")
如果您不想在搜索电子邮件字段时始终记住调用lower(email)
(以及input.downcase
在 Ruby 中的输入),则可以使用数据类型使email
列本身不区分大小写。citext
这就是我刚才所做的。我创建了这样的迁移:
class ChangeUsersEmailToCitext < ActiveRecord::Migration
def up
# Rails 4:
#enable_extension("citext")
# Rails 3:
execute 'create extension citext'
change_table :users do |t|
t.change :email, :citext
end
end
end
现在我不再需要做任何额外的努力来使查询不区分大小写!现在这一切都在幕后为我自动处理了。
这使用 PostgreSQL 的citext扩展。
http://www.sfcgeorge.co.uk/posts/2013/11/12/case-insensitive-usernames-with-postgres有一篇很好的文章。
实际上,您可以在 Rails 中不可知地执行此操作:http ://robb.weblaws.org/2013/12/05/yes-rails-supports-case-insensitive-database-queries/