代码之家  ›  专栏  ›  技术社区  ›  Darryl

验证rails中的模型关系

  •  -1
  • Darryl  · 技术社区  · 16 年前

    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
    

    当我运行此命令时,每章会出现一个“chapters is invalid”(章节无效)错误(如示例所示,硬编码时会出现4个错误)。在生成调用中显式设置:book_id没有帮助。

    但是,如果我在添加章节之前保存该书,则不会出现错误。如果我去掉第章中的验证,它是有效的,没有错误。但这两种变通办法都不能让我高兴。一本书不允许在没有章节的情况下存在于数据库中,一个章节不允许在没有链接到书的情况下存在于数据库中。实施关系约束的正确方法是什么?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Greg Dan    16 年前

    这就是ActiveRecord现在的工作方式。验证非常有效,但仅适用于单个模型。一个月前我也有类似的问题。但我还没有找到任何干净的解决办法。所以我投了赞成票 idea

    我想有人可以想出一些棘手的交易解决方案,但在我看来,您应该接受任何可以实施的解决方案并继续前进。顺便说一句,我不是管道胶带程序员。

        2
  •  0
  •   Rob Wilkerson    16 年前