2009-10-01 94 views
-1

對於從屬模型包含什麼樣的驗證?例如,假設你有章節的書籍。每本書的章節數量是在書籍第一次創建時確定的。在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 

當我運行此我得到一個「章節是無效的」每章錯誤(4個錯誤,當硬編碼類似的例子)。在構建調用中明確設置:book_id不起作用。

但是,如果我在添加章節之前保存該書,它將起作用,沒有錯誤。如果我在第一章中驗證了它的有效性,那麼不會有錯誤。但是這些解決方法都不能讓我開心。一本書不應該被允許在沒有章節的情況下存在於數據庫中,並且一章不應該被允許存在於數據庫中而不被鏈接到一本書。什麼是強制執行關係約束的正確方法?

我是ruby和rails的新手,所以完全有可能我只是沒有考慮rails-ese。請edumacate我。

+0

有關爲什麼問題被低估的任何反饋? – Darryl 2015-09-30 16:58:56

回答

1

這就是現在ActiveRecord的工作原理。驗證效果很好,但僅適用於單一型號。一個月前我有類似的問題。但我還沒有找到任何干淨的解決方案。所以我投了這個idea。看來這些問題是AR核心設計的結果,並不容易解決。

我想有人可以用交易思考一些棘手的解決方案,但在我看來,您應該接受任何可以實施並繼續前進的解決方法。順便說一句,我不是膠帶程序員。