6

我必须从User模型中查找所有具有子字符串“cpg”的电子邮件。所以它将匹配“cpg@yahoo.com”、“cpg3333@yahoo.com”等

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

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

4

4 回答 4

14

在 Rails 中没有什么可以做的,你可以只使用 PostgreSQL 的ilike(不区分大小写的函数)。

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

于 2013-10-10T15:24:27.250 回答
10

如果您不想在搜索电子邮件字段时始终记住调用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有一篇很好的文章。

于 2014-09-03T19:36:08.967 回答
6

实际上,您可以在 Rails 中不可知地执行此操作:http ://robb.weblaws.org/2013/12/05/yes-rails-supports-case-insensitive-database-queries/

于 2014-01-30T21:17:29.167 回答
2

选项1:

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

选项 2:使用 Postgres 的 citex扩展,它会为你做这件事(如上所述)。

于 2016-06-20T12:51:10.303 回答