2009-11-15 9 views
2

a 2 modèles:Régler la valeur de la colonne aléatoire par défaut dans le modèle ActiveRecord

class User < ActiveRecord::Base 
    has_many :posts 
end 

et

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

la table a une colonne Messages: u_hash. Ceci est supposé être un hash d'identification généré aléatoirement (pour le public). Quelle est la meilleure façon de générer ce hachage et comment puis-je l'ajouter à la table? L'idée est que tout cela se passera en arrière-plan et ne sera pas visible par l'utilisateur (pas de champ caché dans le formulaire). La base de données utilisée est MySQL si cela peut m'aider d'une manière ou d'une autre.

Merci d'avance! J

Répondre

4

Vous avez probablement besoin before_validation_on_create rappel pour votre modèle Post. Ce rappel est appelé en interne par fonctionnalité ActiveRecord lorsque vous enregistrez un nouvel enregistrement Post dans la base de données.

Une bonne référence de rappel et une indication des rappels de commande sont appelés, vous pouvez trouver here.

est ici un code, qui explique pourquoi il est before_validation_on_create que vous devez utiliser:

class Post < ActiveRecord::Base 
    belongs_to :user 
    validates_uniqueness_of :u_hash 
    before_validation_on_create :generate_u_hash 

    def generate_u_hash 
    begin 
     new_u_hash = "random hash here" 
    end while Post.find_by_u_hash(new_u_hash) 
    self.u_hash = new_u_hash 
    end 
end 
+0

Merci, cela a fonctionné parfaitement. –

+1

juste pour aider quelqu'un d'autre avec le même problème: new_u_hash = Digest :: SHA256.hexdigest ("- # {Time.now.to_s} - # {self.title} -") [0,15] là le titre est entré par l'utilisateur :) –

0

Cela ressemble à un travail pour ActiveRecord callbacks.

Si vos tables posts comportent un rappel before_create, vous pouvez créer et définir une valeur automatiquement chaque fois qu'une nouvelle instance de post est créée.

.: par exemple

class Post < ActiveRecord::Base 
    belongs_to :user 

    before_create :set_uhash_column 

    private 

    def set_uhash_column 
    #your code here - something like self.uhash = ... 
    end 
end 
Questions connexes