Les aéroports ont des codes ICAO à quatre lettres. Par convention, celles-ci sont toujours majuscules. Je crée un formulaire pour recevoir une entrée utilisateur, mais ce formulaire doit pouvoir accepter la saisie de l'utilisateur dans des cas mixtes et les empêcher de créer des dupes.
Le Par exemple, s'il y a déjà un Aéroport avec ICAO de Par défaut code> est cas- sensible, bien sûr. J'ai compris comment transformer l'entrée de l'utilisateur en majuscule avant d'être enregistrée, mais le problème est que cela semble être post-validation, au lieu de la pré-validation. P>
Klax CODE>, un utilisateur peut entrer
klax code>, il sera validé comme unique, puis transformé en majuscules et stockés, entraînant des doublons. P> < p> Voici mon code modèle à présent. p>
4 Réponses :
Essayez ceci:
validates :icao, :uniqueness => { :case_sensitive => false }
ou faire un avant_validation au lieu d'avant_save :)
Parfait, Danny - avant_validation est exactement ce dont j'avais besoin.
Simplement corrigé (autant de problèmes de rails sont) - Comme Danny a souligné ci-dessus, bien que pas dans sa propre réponse, je ne peux donc pas l'accepter :), changer avant_save code> vers
avant_validation code> la corrige parfaitement. p>
ou une prise légèrement différente: écrire un setter pour et vous pouvez ensuite utiliser une validation régulière d'unicité ( Retourner avec un index unique dans votre DB ) . Peut même rendre les choses un peu plus faciles à faciliter la DB lors de découvertes, car il n'a plus à s'inquiéter de comparaisons insensibles de cas. P> espère que cela aide! P> P> ICAO code> qui convertit tout ce qui les a projetée en majuscule:
Merci, une façon intéressante de la manipuler aussi. J'ai aussi pour une raison quelconque n'a pas supposé que je devrais indexer mes champs manuellement, c'est très bon à savoir. Facilement fait, mais important! Merci!
Réponse mise à jour pour les rails 4.
class Airport < ActiveRecord::Base validates :icao, :name, :lat, :lon, :presence => true validates :icao, :uniqueness => { case_sensitive: false } def icao=(val) write_attribute :icao, val.upcase end end