2010-07-21 5 views
2

Je souhaite créer des validations spécifiques à l'utilisateur.ActiveRecord: validations spécifiques à l'utilisateur

L'utilisateur a une colonne appelée "rule_values" qui est un hachage sérialisé de certaines quantités.

Dans un modèle distinct, Foo, j'ai une validation:

class Foo < ActiveRecord::Base 
    belongs_to :user 

    n = self.user.rule_values[:max_awesome_rating] #this line is giving me trouble! 
    validates_presence_of :awesome_rating, :in => 1..n 
end 

Il semble que l'auto fait référence à Foo (ce qui est la raison pour laquelle je reçois une erreur de méthode non définie) et non une instance de Foo. Comment puis-je accéder à l'instance User à partir du modèle Foo?

Répondre

1

Que diriez-vous de créer une validation personnalisée sur Foo quelque chose comme ça?

class Foo < ActiveRecord::Base 

    validate do |foo| 
    n = foo.user.rule_values[:max_awesome_rating] 
    unless (1..n).include? foo.awesome_rating 
     foo.errors.add :awesome_rating, "must be present and be between 1 and #{n}" 
    end 
    end 

end 

De cette façon, vous avez accès à l'instance et l'association des utilisateurs

+0

des points supplémentaires pour l'utilisation d'un bloc. Beau travail, tout le monde! Merci! – user94154

1

Rails supports personnalisés validations (en utilisant validate). Voici une idée de la façon dont cela pourrait fonctionner (ne l'a pas vérifié cependant):

class Foo < ActiveRecord::Base 
    belongs_to :user 
    validate :awesome_rating_is_in_range 

    def awesome_rating_is_in_range 
    errors.add(:awesome_rating, 'not in range') unless (1..user.rule_values[:max_awesome_rating]).include? awesome_rating 
    end 
end