1

私は、åäöからベトナムの標識まで、あらゆる種類の文字を使用する都市の名前のデータベースを持っています。地名はすべて大文字の形式です(例:「ニューヨーク」や「エクスアンプロヴァンス」)。

私の問題は、postgresqlを使用するHerokuでこれらの都市名を検索しようとすることです。

p = Place.where("upper(name) LIKE '%" + place_name_searched.to_s.upcase.tr('åäöüñï','ÅÄÖÜÑÏ') + "%'").first

これは私が思いついた最高のものですが、これはåäöなどの修正に過ぎず、「é」など、そこにある100以上の異なる文字すべてをキャッチするわけではありません。解決策は、その文字列をこれ以上入力しないことです。

一般的な問題は、upper(name)はすべてをうまく翻訳しているように見えますが、upcaseは英語の文字しか処理できないことです。したがって、place_name_searched ='täby'の場合、対応する検索は.where( "TÄBYlike'TäBY')になります。

では、「Täby」や「JiddḨafş」などのpostgresqlエントリを、ユーザーが入力した小文字の対応する文字列( "täby"、 "jidd hafs")に一致させるにはどうすればよいですか?

Mysqlバージョンのアプリケーションではすべて正常に動作しますが、Herokuにアップロードするとすべて失敗します。

4

1 に答える 1

2

Postgresには、大文字と小文字を区別しないパターンマッチングのための「ILIKE」と呼ばれる拡張機能があります。

p = Place.where("upper(name) ILIKE '%" + place_name_searched.to_s.upcase.tr('åäöüñï','ÅÄÖÜÑÏ') + "%'").first

ただし、これはPostgresでのみ機能するため、実行している環境を確認して、通常の環境の代わりにこれを使用するかどうかを決定する必要があることに注意してください。

于 2012-05-04T12:11:57.363 に答える