验证rails中的模型关系

时间:2009-10-01 20:02:23

标签: ruby-on-rails validation

对于下属模型,包含哪种正确的验证方式?例如,假设你有书中的章节。每本书的章节数量是在首次创建书籍时确定的。

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

当我运行这个时,我会在每章中得到一个“章节无效”错误(当像示例一样硬编码时出现4个错误)。在构建调用中明确设置:book_id无济于事。

但是,如果我在添加章节之前保存这本书,它就可以运行,没有错误。如果我在章节中取出验证它可以工作,没有错误。但这些变通办法都没有让我开心。如果没有章节,则不应允许书籍存在于数据库中,并且不应将章节存在于数据库中而不链接到书籍。什么是强制执行关系约束的正确方法?

我是ruby和rails的新手,所以我完全有可能我还没想到rails-ese。请爱我。

2 个答案:

答案 0 :(得分:1)

这就是ActiveRecord现在的工作方式。验证效果很好,但仅限单个模型。一个月前我遇到了类似的问题。但我还没有找到任何清洁的解决方案。所以我投了这个idea。看来这些问题是AR核心设计的结果,并不容易解决。

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

答案 1 :(得分:0)

和你一样,我是Ruby和Rails的新手,但validates_associated会帮忙吗? API文档中的详细信息位于http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002171