7
votes

Un moyen simple de toujours faire un champ minuscule dans dB

Actuellement, je fais actuellement ce qui suit dans le modèle:

before_save :to_lower
before_create :to_lower

def to_lower
  self.name = self.name.downcase
end


0 commentaires

4 Réponses :


16
votes

Vous n'avez pas besoin de l'avant_create si vous avez déjà avant_save.

before_save { |user| user.name = user.name.downcase }


4 commentaires

Que diriez-vous avant_save {user.name.downe! }?


@Amitpandya j'ai fini par faire avant_save {| Utilisateur | utilisateur.name.downcase! } Qui fonctionne assez bien, je pense que vous devez toujours utiliser | utilisateur | ou vous n'avez rien à faire référence.


@BaneOffernity, quelle version de rails utilisez-vous?


Soyez prudent si nom est facultatif, il vaut mieux utiliser Essayer.



0
votes

Pourquoi faites-vous cela? Si c'est pour effectuer des recherches insensibles de casse, vous voudrez peut-être simplement mettre cela dans votre logique de requête (en fait, je pense que les rails font un peu de cela déjà). Cependant, si vous souhaitez réellement que les données normalisées en minuscule dans la DB (par exemple, si vous traitez avec des hachages SHA1 ou quelque chose), vous faites la bonne chose.


5 commentaires

Vous pouvez le faire dans la DB mais ce serait terriblement inefficace.


@Tom: Pourquoi dites-vous cela? Pour certains cas d'utilisation (par exemple, le cas de normalisation que j'ai mentionné), le faire dans la DB serait beaucoup plus efficace.


@Marmen Désolé pour la confusion, je parle principalement de la partie de faire des recherches insensibles sur la casse dans la logique de la requête. où plus bas (champ) = inférieur (entrée) est sensiblement plus lent que où champ = inférieur (entrée) .


@ Marnenlaibow-Koser Basse () Appliquez une fonction sur chaque champ, ceci est terriblement innéficient car il évite d'utiliser des index.


@ArNoldroa Vous pouvez réellement indexer sur Basse (champ) si vous le souhaitez.



3
votes

Je gère généralement de tels cas par: xxx


0 commentaires

1
votes
def name=(val)
  write_attribute(:name, val.downcase)
end

0 commentaires