2009-10-01 7 views
-1

Quel est le type de validation à inclure pour les modèles subordonnés? Par exemple, disons que vous avez des livres avec des chapitres. Le nombre de chapitres par livre est déterminé lors de la création du livre.Validation des relations de modèle dans les rails

class Book < ActiveRecord::Base 
    has_many :chapters 

    def build_chapters(count) 
    (1..count).each do |i| 
     chapters.build(:sequence_number => i) 
    end 
    end 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 

    validates_presence_of :book_id, :sequence_number 
end 

class BooksController < ApplicationController 
    def create 
    @book = Book.new(params[:book]) 
    @book.build_chapters(4) #to simplify example, hardcode number of chapters 
    @book.save 
    # View-related code omitted for simplicity 
    end 
end 

Quand je lance ce je reçois une erreur « chapitres est invalide » par chapitre (4 erreurs lorsque codées en dur comme dans l'exemple). Définir explicitement le: book_id dans l'appel de construction n'aide pas.

Cependant, si je sauvegarde le livre avant d'ajouter des chapitres cela fonctionne, pas d'erreurs. Si je retire la validation dans le chapitre cela fonctionne, pas d'erreurs. Mais aucune de ces solutions de contournement ne me rend heureux. Un livre ne devrait pas être autorisé à exister dans la base de données sans ses chapitres, et un chapitre ne devrait pas être autorisé à exister dans la base de données sans être lié à un livre. Quelle est la bonne façon de faire respecter les contraintes relationnelles? Je suis novice en matière de rubis et de rails, alors c'est tout à fait possible, je ne pense pas encore à rails-ese pour le moment. S'il vous plaît, édulcatez-moi.

+0

Avez-vous des commentaires sur les raisons pour lesquelles la question a été rejetée? – Darryl

Répondre

1

Voici comment fonctionne ActiveRecord maintenant. Les validations fonctionnent très bien, mais uniquement pour les modèles uniques. Il y a un mois, j'ai eu un problème similaire. Mais je n'ai trouvé aucune solution propre. Par conséquent, j'ai voté pour ce idea. Il semble que ces problèmes sont le résultat de la conception du noyau AR et ne peuvent pas être facilement résolus. Je suppose que quelqu'un peut imaginer une solution délicate avec les transactions, mais à mon avis, vous devriez accepter toute solution de contournement que vous pouvez mettre en œuvre et passer à autre chose. BTW Je ne suis pas le programmeur de ruban adhésif.

Questions connexes