57 votes

Comment faire un ordre insensible à la casse dans Rails avec postgresql

Je suis en train de permuter mon environnement de développement de sqlite3 à postgresql 8.4 et de faire face à un dernier obstacle.

Dans mon original, j'avais la ligne suivante dans une méthode d'assistance;

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

qui a fourni une très belle recherche insensible à la casse. Je ne peux pas reproduire cela pour postgresql. Devrait être facile - des idées?

Merci.

86voto

LanceH Points 958
 result = Users.find(:all, :order => "LOWER(name)")
 

Pour prendre un peu de Brad et Frank.

32voto

Thomas Klemm Points 4335

La réponse populaire de LanecH adaptée pour Rails 3+ (y compris 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
 

6voto

rfusca Points 3584

Avez-vous envisagé de stocker votre colonne en tant que type citext ? Il ne fait qu'internaliser l'appel à lower () si je comprends bien. Ce serait automatique pour vous après. Si vous avez parfois besoin d'une recherche sensible à la casse, cela peut ne pas être la meilleure idée cependant.

5voto

Frank Heikens Points 29270

En SQL, vous pouvez utiliser ORDER BY LOWER (nom_colonne), aucune idée de la manière de le faire en Ruby. Un index fonctionnel (également sur LOWER (nomcolonne)) aidera à accélérer les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X