La solución del pobre
Si puede crear una función, puede usar esta. Compilé la lista comenzando aquí y añadido a ella con el tiempo. Es bastante completo. Es posible que incluso desee eliminar algunos caracteres:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Su consulta debería funcionar así:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Para búsquedas ancladas a la izquierda, puede utilizar un índice en la función para muy resultados rápidos:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Para consultas como:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Solución adecuada
En PostgreSQL 9.1+ , con los privilegios necesarios, solo puede:
CREATE EXTENSION unaccent;
que proporciona una función unaccent()
, haciendo lo que necesita (excepto lower()
, solo utilícelo adicionalmente si es necesario). Lea el manual sobre esta extensión
.
También disponible para PostgreSQL 9.0 pero CREATE EXTENSION
la sintaxis es nueva en 9.1.
Más sobre sin acento e índices: