嵌套属性:如果您使用reject_if,为什么要验证嵌套模型?

时间:2016-10-11 17:46:17

标签: ruby-on-rails

我是一个铁路noobie,我试图理清基于空属性拒绝实例与创建检查属性存在的验证之间的区别。

学生有很多考试。考试的关键属性是分数。没有它,考试不应该被接受进入数据库。

我的考试模型有以下几行:

validates :score, presence: true

我的学生模特有这个:

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

似乎第二个例子悄悄地拒绝"将考试输入数据库,而第一个示例吐出错误消息并要求您再次尝试。

但实际上,这里的区别是什么......看起来他们最终都阻止了一个实例进入数据库 - 我是否会从包含两条线路中受益?

1 个答案:

答案 0 :(得分:1)

  

但实际上,这里的区别是什么......

差别是绝对的:)你将逻辑隔离到它所属的位置。

Exam模型中的内容仅涉及Exam模型。

您在Student模型中定义的内容仅涉及Student模型。

这就是说,您已经通过了reject_if模型中的Student并允许保存交易继续前进。如果嵌套对象的模型(Exam中的验证失败,它根据定义是独立的),它将不会保存嵌套对象。

  

我会从包括两条线中受益吗?

Exam模型中进行验证可以避免将无效对象保存到db中,并且它与验证Student模型中的嵌套对象创建无关。

无论如何,这些东西是分开的,不同的,没有联系。