3

Je demande à nouveau this question car le code et l'exemple sont incorrects (cela fonctionne dans le cas indiqué).Rails ActiveRecord: Ignorer les validations pour les associations

Compte tenu de ces modèles:

class Author < ActiveRecord::Base 
    has_many :books 
    validates_presence_of :email 
end 

class Book < ActiveRecord::Base 
    belongs_to :author 
    validates_presence_of :title 
end 

Nous pouvons passer des validations lors de la création d'un livre:

b = Book.new 
b.save(:validate => false) 

Mais si nous récupérons le Livre invalide de la base de données et lui attribuer à l'association Auteur, nous ne sommes pas autorisés à enregistrer Auteur:

a = Author.new 
a.email = "foo" 
a.books = Book.all 
a.save! 

Ceci est l'erreur:Comment pouvons-nous ignorer les validations pour les modèles Book associés sans les ignorer pour Author?

Notez que dire has_many :books, :validate => false dans l'auteur n'aide pas: l'association est silencieusement jetée avec l'auteur est enregistré.

Répondre

11

Essayez que

class Author < ActiveRecord::Base 
    has_many :books, :validate => false 
    validates_presence_of :email 
    after_save :save_invalid_books 

    def save_invalid_books 
    books.each do |b| 
     b.save(false) 
    end 
    end 
end 

Pour autant que je comprends, la validate => false ne vous permet d'enregistrer l'auteur sans être arrêté par un livre non valide, mais pour sauver l'association dont vous avez besoin d'un livre valide que vous changera la clé author_id. Vous ne pouvez pas changer les internes des rails, mais vous pouvez toujours les tromper, en enregistrant l'auteur sans validation, puis en mettant à jour chaque livre et en forçant save (avec save (false)) juste après.

Bien sûr, ce code peut être amélioré de plusieurs façons, car il n'est probablement pas nécessaire de sauvegarder tous les livres à chaque fois pour commencer, mais vous en avez l'idée.

+0

Merci! Votre code fonctionne. J'ai oublié que l'association mettait à jour la clé étrangère (et donc le modèle doit être valide). –

+0

Je suis heureux d'avoir pu aider :) – Nycen

Questions connexes