2012-05-04 14 views
1

私は、すべての異なる種類の文字を使用する都市の名前を持つデータベースをåäöからvietnamese signsに持っています。地名はすべて大文字で書かれています。 "ニューヨーク"と "エクスアンプロヴァンス"。Heroku/postgresql検索

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

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

これは私が出ている最高のですが、それは例えば、そこに存在しているだけですが、AAOなどの修正およびすべての100+の異なる文字をキャッチしていません"é"解決策は、その文字列をそれ以上記入することではありません。

一般的な問題は、upper(name)はすべてをうまく翻訳するようですが、upcaseは英語の文字しか扱えないということです。

したがって、 "Täby"や "JiddḨafş"などのpostgresqlエントリを対応する文字列に一致させるには、対応する文字列をdowncaseで指定します(例: "Täby"のような 'TäBY')。 、ユーザー(「タビー」、「jidd hafs」)によって入力された?

それはすべてのアプリケーションの私のMySQLのバージョンでは正常に動作しますが、私はそれがすべて失敗したHerokuのにアップロードしたら。

+0

は直接関連していませんが、いつでも思い出させることができます:[SQLインジェクションに注意してください](http://guides.rubyonrails.org/active_record_querying.html#conditions) –

+0

また、[unaccent ](http://www.postgresql.org/docs/current/interactive/unaccent.html)。 HerokuがCREATE EXTENSION unaccent;でPostgreSQL 9.0以降をインストールできるかどうかは不明です。 –

+0

ヒントをありがとう! – Christoffer

答えて

2

Postgresは拡張子を持っています大文字と小文字を区別しないパターンマッチングのための「ILIKE」と呼ばれるものである。

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

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

+0

これは完璧に機能しました。私は、ProductionやDevelopmentをチェックするためにifを使う必要がありましたが、それはquickfixでした。ありがとう! – Christoffer

+0

それはあなたのために働いてうれしい。 Railsは優れたORM機能を提供しますが、異なる環境で同じ設定を行うことは常に良いことだと思います。私はまだ私のdevの箱にsqliteを使用していますが、ある日私はそれをpostgresに移行します。ある日! :D –