2011-01-22 3 views
0

je les suivantes:rails - Recherche Insensible Condition cas

@users = User.find(:all, 
         :select => 'users.*', 
         :conditions => ["fname || ' ' || lname LIKE ?", '%'+"#{params[:q]}"+'%'] 

problème ici est que les params d'entrée de recherche [:] q est sensible à la casse. Comment puis-je le rendre insensible à la casse dans mon application Rails 3 Heroku?

Merci

Répondre

7

Pour que PostgreSQL soit insensible à la casse, utilisez simplement ILIKE. Cela fonctionne en fonction des paramètres régionaux actifs.

+0

Tous les index spéciaux nécessaires pour faire de cette course en douceur? Tous les indices du tout d'ailleurs? – AnApprentice

+1

@AnApprentice: ça marchera très bien, mais ILIKE n'est pas un opérateur indexable. Si vous avez besoin d'un accès indexé, voir la suggestion de polarblaus sur l'utilisation de LIKE supérieur() et régulier, qui peut être rendu indexable. –

+1

Je suppose qu'il n'y a aucun moyen d'indexer une instruction LIKE commençant par% (correspondre à n'importe quel contenu). Et la première partie de l'instruction est variable - nécessite un index basé sur l'expression séparé. Pour trouver comment votre schéma fonctionne, exécutez la requête avec 'EXPLAIN' pré-ajouté. – gertas

3

Une solution assez « commune » pour ce problème semble être d'utiliser la fonction UPPER pour convertir dans votre cas « fname » ou « lname » en majuscules et convertir params[:q] ainsi, en utilisant par exemple upcase.

0

... Sinon coller dans votre modèle et appeler en passant dans un tableau de chaînes

def self.find_all_by_lowercasing_name(str_array) 
    wrapped = str_array.collect { |a| "'"+ "#{a.downcase}" + "'" } 
    return MyModel.where("lower(\"my_models\".\"name\") IN (#{wrapped.join(', ')})") 
end 

Les travaux ci-dessus avec Postgres et SQLite

Questions connexes