2010-06-03 6 views
1

Dans un modèle de rails, est-il possible de faire quelque chose commeDéfinition de Rails OU conditions dans validate_presence_of dans un modèle?

class Example < ActiveRecord::Base 
    #associations 

    validates_presence_of :item_id, (:user_id OR :user_email) 

    #functions 
end 

Lorsque le modèle a 3 colonnes de :item_id, :user_id et :user_email? Je veux que le modèle soit valide tant que j'ai un :user_id ou un :user_email.

L'idée étant que si l'article est recommandé à une personne qui n'est pas encore inscrite, elle peut être associée par courriel à l'inscription de la personne recommandée.

Ou existe-t-il une autre méthode que je peux utiliser à la place?

Répondre

1

Une approche consiste à envelopper les champs comme un attribut virtuel, par exemple:

class Example < ActiveRecord::Base 

    validates_presence_of :referral 

    def referral 
    user_id || user_email 
    end 
end 

ou vous pouvez simplement lancer une méthode de validation personnalisée validate. Voir personnalisés sur la validation du Rails API

Si les deux user_id et user_email viennent d'un autre modèle, peut-être il est préférable d'ajouter l'association au lieu

class Example 
    belongs_to :user 
    validates_associated :user 

    before_validate :build_user_from_id_or_email 

    def build_user_from_id_or_email 
    # ... Find something with the parameters 
    end 
end 
+0

tas Merci! Exactement ce dont j'avais besoin! –

0
validates_presence_of :item_id 
validates_presence_of :user_id, :if => Proc.new{ |x| x.user_email.blank? } 
validates_presence_of :user_email, :if => Proc.new{ |x| x.user_id.blank? } 
Questions connexes