11
votes

Mass Downcase Un champ pour tous les enregistrements dans les rails

Lorsque j'ai mis en œuvre un modèle d'utilisateur pour la première fois, j'ai autorisé l'utilisateur à saisir un courrier électronique supérieur ou minuscule pour ses informations de connexion. Le problème est que c'est une application mobile, et parfois des autocaps se produisent afin que l'utilisateur ne soit pas authentifié. J'ai changé la méthode de création pour downcase l'e-mail d'abord. Cependant, cela provoque des personnes ayant des comptes existants de ne pas être cohérents

Alors, comment puis-je ajouter une migration à la masse Mettre à jour le champ Email de la table des utilisateurs à la downcase?


2 commentaires

Les adresses électroniques sont insensibles à la casse, elles doivent donc toujours être pliées en minuscules pour la comparaison et le stockage. C'est l'une de ces choses qui sont négligées pendant la conception de l'application ... une fois ... alors vous vous en souvenez de nouveau. :-)


Pas vrai. Les adresses électroniques sont sensibles à la casse. RFC5321 STATS: [La partie locale d'une boîte aux lettres doit être traitée comme sensible à la casse. Par conséquent, les implémentations SMTP doivent veiller à préserver le cas de la boîte aux lettres locales. En particulier, pour certains hôtes, l'utilisateur "Smith" est différent de l'utilisateur "Smith".] Cela dit, pour des raisons pratiques, je conviens que la baisse des adresses électroniques, en particulier pour les comparaisons, vaut la peine d'être fait.


5 Réponses :


7
votes

La solution la plus simple est d'utiliser simplement le code Ruby:

class DowncaseEmail < ActiveRecord::Migration
  def up
    if %w[MySQL PostgreSQL].include? ActiveRecord::Base.connection.adapter_name
      execute "UPDATE users SET email = LOWER(email)"
    else
      User.all.each do |user|
        user.update_attributes email: user.email.downcase
      end
    end
  end
end


0 commentaires

24
votes

La manière la plus efficace serait d'éviter d'utiliser un itérateur rubis et de le faire directement dans SQL.

Intérieur d'un fichier de migration normal Vous pouvez utiliser ce SQL pour MySQL: P>

execute("UPDATE users SET email = LOWER(email)")


1 commentaires

Habituellement, il y aura du code qui doit être modifié en outre, de sorte que les comparaisons se produisent en minuscules et les enregistrements nouvellement insérés sont pliés en minuscules pour que le problème de la réoccupation.



3
votes

Ne vous inquiétez jamais d'optimiser quelque chose que vous allez faire une fois. Sauf si vous avez des nombres massifs d'utilisateurs, utilisez simplement la méthodologie qui vous sera le plus familière. (Bien que je recommanderais simplement d'exécuter la requête SQL.)


1 commentaires

Merci à tous pour des solutions. J'avais seulement environ 300 utilisateurs, alors faire une simple migration était la plus facile pour moi. À votre santé.



15
votes

Vous pouvez simplement aller avec xxx


1 commentaires

aimer cette solution.



0
votes

plutôt que de faire des itérations, ci-dessous est la solution la plus simple: xxx


0 commentaires