2011-07-31 14 views
11

私の開発データベースはSQLiteですが、私はHerokuに自分のアプリケーションをデプロイしています。彼らはPostgreSQLを使用しています。Postgresの大文字と小文字を区別しないRailsでの検索

PostgreSQLは大文字と小文字を区別しますが、SQLiteはそうでないため、検索を実行すると2つの異なる結果が出ることがあります。

これらのことを標準化してはいけませんか?私はそれを解決するためにどのような方法を使うべきですか? Postgresの中

Here is how to fix it with raw SQL

+1

私は、Herokuにデプロイする場合、PostgreSQLの上で開発することをお勧めします。 ORMは、データベース固有の動作からあなたを守りません。 –

+1

そして私はローカルでSQLiteとPostgreを使って出荷しているのが好きなので、特定のDBに縛られていません。それぞれ自分自身に。 –

答えて

41

大文字小文字を区別しない検索:

  • 使用ilike代わりlike(大文字と小文字を区別しないように)
  • のあなたは=使用したい場合は、両側がUPPERまたは
  • LOWERのいずれかにします
+4

ありがとうございました! 'like'の問題は、' OR'演算子でそれらをどのように連鎖させるのか分かりません。これはレールでサポートされているすべてのデータベースでこれを使用するのが賢明ですか? ( '%#{search_term}%') "' – antpaw

+1

mysql、sqlite、およびpgsqlのコードを十分に動かすことができません。 – antpaw

+0

MYSQLとPOSTGRESの両方で同じコードを実行する場合は、UPPERまたはLOWERを使用してください(ただし、これはベストプラクティスではありません)。 –

4

もう1つはDDLこれを処理する方法はですデータ型、または大文字と小文字を区別しないTEXT。

4

ActiveRecordでは処理できないものが多くあり、LIKEマッチングはその1つです。これは、代わりにまっすぐArelを使用してこれを達成する方法です。

Model.where(
    Model.arel_table[:title].matches("%#{search_term}%") 
) 

あなたは、私が以前にこのためSqueelをお勧めしますが、元の作成者は、それを支える停止しているとフルがあるようには思えない

Model.where(Model[:title].matches("%#{search_term}%")) 

これは少し楽にするためにArel-Helpersをインストールすることができますそれを維持しています。また、プライベートなActiveRecord APIを利用しているため、一定の傾向が必要です。

+0

素晴らしい解決策です.Squeelは素晴らしいですが、これはPostgres固有の動作です。他のRDBMSでこれを行う場合は、大文字と小文字が区別されます。 – kgx

+0

@kgx実際には、この例はどちらの場合も意図どおりに動作します。 @antpawは上記のように、SQLiteの 'LIKE'はデフォルトで大文字と小文字を区別しません。したがって、これはSQLiteでは 'LIKE'を、PostgreSQLでは' ILIKE'を使用します。 –

関連する問題