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)(およびRuby で入力する)ことを常に覚えておく必要がない場合は、データ型を使用して、列自体で大文字と小文字を区別しないようにすることができます。input.downcaseemailcitext

それが私がやったことです。次のような移行を作成しました。

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 に答える
2

オプション1:

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

オプション 2: Postgres の citex拡張機能を使用してください (上記の回答のとおり)。

于 2016-06-20T12:51:10.303 に答える