How can I modify a where/like condition on a search query in Rails:
find(:all, :conditions => ["lower(name) LIKE ?", "%#{search.downcase}%"])
so that the results are matched irrespective of accents? (eg métro = metro). Because I’m using utf8, I can’t use “to_ascii”. Production is running on Heroku.
Proper solution
Since PostgreSQL 9.1 you can just:
Provides a function
unaccent(), doing what you need (except forlower(), just use that additionally if needed). Read the manual about this extension.More about unaccent and indexes:
Poor man’s solution
If you can’t install
unacccent, but are able to create a function. I compiled the list starting here and added to it over time. It is comprehensive, but hardly complete:Your query should work like that:
For left-anchored searches, you can use an index on the function for very fast results:
For queries like:
Or use
COLLATE "C". See: