2010-08-11 6 views
3

J'ai le scénario suivant validates_associatedmodèle validates_associated avec état

class Parent 
    include Mongoid::Document 
    validates_associated :son 
    validates_associated :daughter 
end 

quand je crée un parent, soit de fils ou fille ne crée pas les deux. Maintenant, mon problème est, quand j'essaie de créer un parent avec fils, alors la validation échoue en raison de la validation fille et vice versa.

Est-il possible que je puisse valider le fils unique lorsque les paramètres fils sont affichés ou ou valider fille unique lorsque les paramètres de fille sont affichés

Merci

Répondre

4

Vous pouvez fournir un: si l'option et tester si la document associé existe:

class Parent 
    include Mongoid::Document 
    validates_associated :son, :if => Proc.new { |p| p.son.present? } 
    validates_associated :daughter, :if => Proc.new { |p| p.daughter.present? } 
end 
3

Pourquoi utilisez-vous pas un objet enfant associé, qui a un attribut (par exemple gender) s'il s'agit d'un fils ou d'une fille.

modèle Child (mâle ou femelle, selon la valeur gender):

class Child 
    include Mongoid::Document 
    field :gender, :type => Symbol 
    # and more fields as you probably want 
    embedded_in :parent, :inverse_of => :child 
    # your validation code 

    def son? 
    gender == :male 
    end 
    def daughter? 
    gender == :female 
    end 
end 

seront intégrés dans Parent modèle:

class Parent 
    include Mongoid::Document 
    embeds_one :child 
    validates_associated :child 
end 
+0

En fait, cela ne résout pas mon problème. problème. Est-ce que nous pouvons valider le modèle assocaited si les champs de ce modèle sont fournis? Merci – Gagan

+0

Désolé, mais maintenant je ne comprends pas quel est votre problème ici? Pourquoi cela ne résout-il pas votre problème? Quel est le problème avec cette solution? – jigfox

+0

probablement je pense que je n'ai pas eu ce que vous essayez de dire. Une autre explication pourrait aider. Certains codes de rails structurés seront beaucoup mieux. Merci – Gagan