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)
(およびRuby で入力する)ことを常に覚えておく必要がない場合は、データ型を使用して、列自体で大文字と小文字を区別しないようにすることができます。input.downcase
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には、これに関する素晴らしい記事があります。
オプション1:
User.where('LOWER(email) = LOWER(?)', search_email)
オプション 2: Postgres の citex拡張機能を使用してください (上記の回答のとおり)。