2016-10-11 64 views
1

我是一個rails noobie,我試圖理清拒絕基於空屬性的實例和創建一個檢查屬性存在的驗證之間的區別。嵌套屬性:如果您使用reject_if,爲什麼要驗證嵌套模型?

學生有很多考試。考試的關鍵屬性是分數。沒有這個,考試不應該被接受到數據庫中。

我的考試模式有以下行:

validates :score, presence: true 

我的學生模型具有這樣的:

accepts_nested_attributes_for :exams, 
:reject_if => proc { |exam| exam['score'].blank? } 

看來,第二個例子中悄然「拒絕」被輸入到數據庫中考而第一個示例則吐出一條錯誤消息,並要求您再試一次。

但是真的,這裏有什麼區別......它似乎最終阻止了一個實例被輸入到數據庫中 - 我是否從包含這兩行中受益?

回答

1

但實際上,這裏有什麼區別...

的區別是絕對的:)你分離的邏輯其所屬的地方。

你有什麼在Exam模型只涉及Exam模型。

你在Student模型中定義了什麼,好吧,只關注Student模型。

這就是說,你已通過reject_ifStudent模型,並允許保存交易前進。如果其模型中的驗證失敗(Exam,根據定義獨立),它將不保存嵌套對象。

我會從包括兩條線都受益嗎?

Exam模型有驗證可以讓你避免保存無效對象到數據庫,並沒有任何與Student模型驗證嵌套的對象創建。

以任何方式,這些東西是分開的,不同的,沒有任何聯繫。