ruby on rails - conectar - Cómo hacer un orden insensible a mayúsculas/minúsculas en Rails con postgresql
conectar ruby on rails con postgresql (5)
¿Ha considerado almacenar su columna como tipo de texto? 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.
Estoy en el proceso de cambiar mi entorno de desarrollo de sqlite3 a postgresql 8.4 y tengo un último obstáculo.
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 buena búsqueda insensible a mayúsculas y minúsculas. No puedo replicar esto para postgresql. Debería ser fácil, ¿alguna idea?
Gracias.
Ahora con Rails 5.2 probablemente recibirá una advertencia si usa la respuesta aceptada.
ADVERTENCIA DE DEPRESIÓN: método de consulta peligroso (método cuyos argumentos se usan como SQL sin procesar) llamado con argumento (s) sin atributo (s): "BAJO (?) ASC".
Una alternativa podría ser confiar en Arel (se fusionó ahora en Rails):
results = User.order(User.arel_table[''name''].lower.asc)
# results.to_sql == "SELECT /"users/".* FROM /"users/" ORDER BY LOWER(/"users/"./"name/") ASC"
EN SQL puede usar ORDER BY LOWER (nombre de columna), no tiene idea de cómo hacerlo en Ruby. Un índice funcional (también en LOWER (nombre de columna)) ayudará a acelerar las cosas.
La respuesta popular de LanecH adaptada para Rails 3+ (incluido Rails 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
result = Users.find(:all, :order => "LOWER(name)")
Para tomar un poco de Brad y Frank.