2009-08-08 8 views
2

Je souhaite générer des noms d'utilisateur uniques et anonymes lors de la création d'une instance de mon modèle Utilisateur. Idéalement, il serait défini par défaut si je ne spécifie aucun nom d'utilisateur. Donc, par exemple, quand je fais User.create!(), J'aimerais que la colonne username soit 'anonymous123', où 123 est un nombre unique tiré d'une séquence (la valeur de la colonne id pour cela exemple serait ok).Comment générer des noms d'utilisateur anonymes uniques dans RoR?

Répondre

7

En combinant les exemples de quelques réponses le ferait

class User < ActiveRecord::Base 
    before_create :set_anonymous_username 

    def set_anonymous_username 
    username = "anonymous#{User.last.id + 1}" if username.nil? 
    end 
end 

J'ai utilisé before_create ici parce que je vous attendre que d'avoir à définir un nom d'utilisateur anonyme avant de créer l'utilisateur pour la première fois . Le before_save sera appelé à chaque fois que le modèle est sauvé et pourrait être un surcoût inutile, mais soit fonctionnera

+0

Je voudrais également ajouter un "validates_uniqueness_of: nom d'utilisateur" dans votre modèle d'utilisateur, juste pour être sûr. Il peut aussi payer pour vérifier le nom d'utilisateur généré automatiquement pour s'assurer qu'il n'y a pas de conflits, ou le client peut obtenir des erreurs bizarres et ne pas savoir pourquoi. – askegg

0

Utilisez un filtre before_save pour définir le nom d'utilisateur avant l'enregistrement du modèle, par ex.

class User < ActiveRecord::Base 
    before_save :set_anonymous_username 

    def set_anonymous_username 
    username = "anonymous" + User.find_by_sql("SELECT max(id) FROM users").maxid.to_s if username.nil? 
    end 
end 
+1

plain SQL est une douleur dans le cul si vous voulez changer votre base de données ;-) –

+0

Ouais, n'était pas au courant d'une meilleure façon d'obtenir le dernier ID d'un modèle de rails ... et maintenant je le fais :) – workmad3

0

Quelque chose comme

class User < ActiveRecord::Base 
    def initialize 
    super 
    self.username = "anonymous#{User.last.id + 1}" 
    end 
end 

Est-ce que faire lorsque vous créez une nouvelle instance de l'utilisateur, même avant qu'il ne soit sauvé - dans le cas où vous voulez l'utiliser dans une vue pré-création. Vous voudrez probablement le combiner avec quelque chose before_save comme mentionné ci-dessus pour obtenir le dernier identifiant définitif dans la base de données au moment de la création de l'enregistrement.

+1

surcharger la méthode initialize d'un objet ActiveRecord n'est pas recommandé, surtout si vous n'appelez pas super, vous pouvez regarder le after_initialize rappel de le faire –

+0

gah totalement oublié super :) merci. – zackola

Questions connexes