【问题标题】:Validating model relationships in rails验证 Rails 中的模型关系
【发布时间】:2009-10-01 20:02:23
【问题描述】:

对从属模型包含哪些正确类型的验证?例如,假设您有带有章节的书籍。每本书的章节数是在本书首次创建时确定的。

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。请教育我。

【问题讨论】:

  • 对为什么这个问题被否决有任何反馈吗?

标签: ruby-on-rails validation


【解决方案1】:

这就是 ActiveRecord 现在的工作方式。验证效果很好,但仅适用于单个模型。一个月前,我遇到了类似的问题。但我还没有找到任何干净的解决方案。因此我投票给了这个idea。看来这些问题是AR核心设计的结果,不容易解决。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看起来这并不能验证关联是否正确,只有关联的对象本身是有效的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多