6

Rails 3.0.4を使用しています

ここに私の Rails アプリケーションの Arel クエリの一部があります。upcase メソッドを使用して、データベースに依存しない方法で大文字と小文字を区別しない検索を行うにはどうすればよいですか?

Customer.where("company_id = ? and (firstname like ? or lastname like ? or reference like ?)", current_user.company_id, "%#{params[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%")

ありがとう

4

1 に答える 1

14

ここにいくつかのオプションがあります。

まず、LIKEは既に大文字と小文字を区別しませんが、Postgres ではILIKEを使用して検索を大文字と小文字を区別しないようにする必要があります。

Customer.where('firstname LIKE ?', "%john%").first.name
=> 'John'

第 2 に、<>、=、<= などのパターン一致しない比較と大文字小文字を区別しない比較を行う場合は、COLLATE コマンドを使用して大文字と小文字を区別しない一致を適用できます。

Customer.where('firstname COLLATE utf8_unicode_ci = ?', 'john').first.name
=> 'John'

Postgres にはまだCOLLATEコマンドがないようですが、大文字と小文字を区別しない検索オプションの詳細については、こちらを参照してください。一般に、パターン マッチングや複雑なクエリを実行する場合、データベースに依存しない方法では実行できません。私の推奨事項は、開発と本番の両方で単一のデータベース システムを使用することです。これにより、クエリが両方の環境で同じように動作することが保証され、バグが少なくなります。複数のデータベース システムをサポートする必要がある場合、最適なオプションは単純に 2 つの異なるクエリを作成することです。たとえば、1 つは MySQL で実行し、もう 1 つは Postgres で実行します。

于 2011-02-19T18:18:56.333 に答える