2010-11-30 12 views
4
class Author 
    has_many :books 

    validates :email, :presence => true 
end 

class Book 
    belongs_to :author 

    validates :title, :presence => true 
end 

Skipping validation est facile:Passer la validation des objets connexes - rails activerecord

a = Author.new 
a.save(:validate => false) 

Cependant, je dois passer la validation de l'auteur lors de la création d'un livre sans sauter des validations de livres, comme ceci:

b = Book.new 
b.title = "A Book" 

b.author = Author.last 
b.save 
+1

Pour quelle raison ne créez-vous pas d'abord un auteur valide, puis créez le livre? –

+0

C'est juste un cas particulier de mon système. –

+3

Vous n'avez pas 'validates_associated: author' dans Book, et vous ne modifiez pas Author. Je suis surpris qu'il valide l'auteur à tous. Dans le passé, j'ai utilisé une colonne db booléenne pour remplacer les validations. – aceofspades

Répondre

0

Je n'ai pas bien compris votre question. Dans votre exemple, vous n'êtes pas en train de créer tout nouvel objet auteur:

>  b = Book.new 
>  b.title = "A Book" 
>  
>  b.author = Author.last 
>  b.save 

Si vous essayez de créer un nouvel auteur sans e-mail, ne peut vous le faire:

b = Book.new 
b.title = "A Book" 

author = Author.new 
author.save(:validate => false) 

b.author = author 
b.save 

Hmm ... peut-être que je manque juste quelque chose d'évident ici.

0

Depuis la validation de l'auteur ne semble pas si important lors de l'enregistrement de votre modèle, vous pouvez écrire votre modèle de livre comme celui-ci:

class Book 
    belongs_to :author, :validate => false 

    validates :title, :presence => true 
end 

De cette façon, les auteurs seront sautées de validation lors de l'enregistrement.

+0

Notez que ': validate' est' false' [par défaut] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to-label-Options) donc pas d'écriture de points c'est comme ça. – jibiel