2010-06-06 16 views
44

Estoy en el proceso de cambiar mi entorno de desarrollo de sqlite3 a postgresql 8.4 y tengo un último obstáculo.Cómo hacer un orden insensible a mayúsculas/minúsculas en Rails con postgresql

En mi original tenía la siguiente línea en un método de ayuda;

result = Users.find(:all, :order => "name collate NOCASE") 

que proporcionó una muy agradable de búsqueda entre mayúsculas y minúsculas. No puedo replicar esto para postgresql. Debería ser fácil, ¿alguna idea?

Gracias.

Respuesta

77
result = Users.find(:all, :order => "LOWER(name)") 

Para tomar un poco de Brad y Frank.

+0

Niza, que funcionaba gracias. Me apuntó en la dirección correcta para aprender un poco más sobre esto por mí mismo. Usar UPPER (nombre) también funciona y, de hecho, es lo que ha terminado en mi código, sin ningún motivo en particular. – brad

+2

Una solución más extrema a la que he recurrido es tener una columna extra que rastrea la columna original. Usando activadores en insertar o actualizar, modifique esa columna. He usado esto en el pasado un par de veces, donde quería ordenar los títulos de algo y no quería contar las palabras principales de "a, an, the". También eliminé todos los personajes especiales. Esto resultó en "título", "título", "título", "Título", ordenando uno al lado del otro en lugar de dispersos. También hizo posible editar el campo clasificable para poder hacer que el "título V" venga antes del "título IX". – LanceH

+1

Si necesita esto en 'default_scope', use' default_scope order ('LOWER (name) ASC') '. Me tomó un poco descubrir los detalles. –

5

IN SQL se puede usar ORDER BY LOWER (nombre de columna), no hay idea de cómo hacerlo en Ruby. Un índice funcional (también en LOWER (nombre de columna)) ayudará a acelerar las cosas.

6

¿Ha considerado guardar su columna como citext tipo? Realmente solo internaliza la llamada a lower() tal como lo entiendo. Sería automático para usted después. Si hay ocasiones en que necesita una búsqueda sensible a mayúsculas y minúsculas, esta puede no ser la mejor idea.

+0

Interesante. Es un tipo nuevo para mí. Un poco de lectura sugiere que debe instalar el módulo de citexto por separado para habilitar esta característica en 8.4 (pero estará integrado en 9.0). Esto afectaría la portabilidad de mi código, así que lo dejaré fuera por ahora. No necesito hacer una búsqueda sensible a mayúsculas y minúsculas en este momento, pero creo que me gustaría mantener la opción abierta en este momento, así que lo dejaré por ahora. Muy útil para saber que existe, así que ¡gracias! – brad

23

respuesta popular de LanecH adaptado para rieles 3+ (incluyendo los carriles 4):

users = User.order('LOWER(name)') 

# or create a named scope you can reuse 
class User < ActiveRecord::Base 
    scope :order_by_name, -> { order('LOWER(name)') } 
end 

users = User.order_by_name 
Cuestiones relacionadas