Rails Active Record case insensible trouver
Si, en général, j'aime la sensibilité à la casse dans ma base de données, il y a quelques temps, je trouve ça un de la douleur. user_name et e-mail sont de bons exemples de domaines où je ne veux pas à vous inquiéter au sujet de l'affaire-en particulier lors de la recherche.
Il est assez facile de downcase une chaîne de caractères avant de les enregistrer à l'aide de quelque chose comme:
before_save faire
auto.e-mail.downcase!
fin
De cette façon, le user_name et les mails sont toujours enregistrées en minuscules. Mais quelle est la meilleure façon de find_by_user_name et find_by_email? Je peux bien sûr n'oubliez pas de toujours downcase la chaîne je suis de passage dans ces méthodes--mais ça ne semble pas très SÈCHE.
J'ai pensé sur le remplacement find_by_email et de l'appel de l'original avec super une fois que j'ai downcased l'e-amail, mais je n'avais aucune chance de le comprendre.
Alors, quelle est la meilleure façon de le faire?
PS je ne pense pas que related posts comme celui-ci ( comment puis-je écrire un casse find_by_email pour Rails 3 ) tentent de résoudre le même problème. Sql personnalisé ici avec "bas" serait ointless pour moi puisque j'ai déjà assurée toutes ces valeurs sont plus faibles--il est le seul à venir en ce moment (probablement à partir d'un formulaire où l'utilisateur a entré) dont j'ai besoin downcased.
source d'informationauteur snowguy
Vous devez vous connecter pour publier un commentaire.
L'un de ces devrait être bon:
Mise à jour:
La find_by_... les fonctions sont en fait des non-existants. Lorsque vous appelez l'un d'eux, le ActiveRecord::Base de captures dans l'
method_missing
méthode, et si le nom est bien formaté (contient les noms de colonnes, etc) la méthode de recherche est créé pour la classe. Après cela, il va exister.Si vous avez un
find_by_email
il sera appelé par défaut. Si elle appellesuper
cela signifie que vous essayez d'appelerActiveRecord::Base.find_by_email
qui n'existe pas. Lemissing_method
l'attrape, et crée (en fait remplace votre)find_by_email
mise en œuvre. C'est pourquoi pas bon pour appeler super. Si vous utilisez votre propre mise en œuvre pour la recherche par e-mail, comme je l'ai écrit dans la deuxième partie, alors cela fonctionnera parfaitement.Avec PostgreSQL, vous pouvez faire:
J'ai fait quelque chose comme ceci:
Vous pouvez débat sur si c'est juste ou pas, mais en général, l'email doit PROBABLEMENT être normalisé d'aller dans la base de données pour éviter la nécessité de le faire.
Edit:
Rails 3:
il fonctionne pour moi! merci, mais avec une plus faible(:xxx).
Client.comprend:responsables).où(["inférieur(nom) || lower(contact) || cnpj || les clients.rg || rg ILIKE ?", "%#{params [:]}%"])