La solution du pauvre
Si vous êtes capable de créer une fonction, vous pouvez utiliser celle-ci. J'ai compilé la liste en commençant ici et s'y ajoute au fil du temps. C'est assez complet. Vous pouvez même supprimer certains caractères :
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Votre requête devrait fonctionner comme ça :
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Pour les recherches ancrées à gauche, vous pouvez utiliser un index sur la fonction pour très résultats rapides :
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Pour des requêtes telles que :
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Solution appropriée
Dans PostgreSQL 9.1+ , avec les privilèges nécessaires, vous pouvez simplement :
CREATE EXTENSION unaccent;
qui fournit une fonction unaccent()
, en faisant ce dont vous avez besoin (sauf pour lower()
, utilisez-le simplement en plus si nécessaire). Lisez le manuel sur cette extension
.
Également disponible pour PostgreSQL 9.0 mais CREATE EXTENSION
la syntaxe est nouvelle dans la version 9.1.
En savoir plus sur l'absence d'accent et les index :