2012-05-04 70 views
1

我有一個使用所有不同種類的字符的城市名稱的數據庫,從åäö到越南的標誌。地名全部採用大寫格式,例如「紐約」和「艾克斯普羅旺斯」。Heroku/postgresql搜索

我現在的問題是嘗試在Heroku中使用postgresql搜索這些城市名稱。

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

這是我想出了最好的,但它只是但氧化鋁等的修復和沒有捕捉到所有的100多個不同的人物有在那裏,例如「é」。解決辦法是不要再填寫該字符串。

一個普遍的問題是,upper(name)似乎可以翻譯所有內容,但是隻能處理英文字母。因此,相應的搜索將是.where(「TÄBYlike'TäBY')if place_name_searched ='täby'。

那麼,如何將postgresql條目(例如」Täby「和」JiddḨafş「)匹配到相應的字符串,由用戶(「塔比」,「jidd哈夫斯」)?

這一切工作正常,在應用程序的我的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

工作完美,我不得不用它來檢查生產或開發,但這是一個quickfix。謝謝! – Christoffer

+0

很高興爲你效勞。雖然Rails爲您提供了令人敬畏的ORM功能,但我認爲對於不同的環境擁有相同的設置總是很好的。我仍然在開發箱上使用sqlite,但有一天我會將它遷移到postgres。一天! :d –