我是一个铁路noobie,我试图理清基于空属性拒绝实例与创建检查属性存在的验证之间的区别。
学生有很多考试。考试的关键属性是分数。没有它,考试不应该被接受进入数据库。
我的考试模型有以下几行:
validates :score, presence: true
我的学生模特有这个:
accepts_nested_attributes_for :exams,
:reject_if => proc { |exam| exam['score'].blank? }
似乎第二个例子悄悄地拒绝"将考试输入数据库,而第一个示例吐出错误消息并要求您再次尝试。
但实际上,这里的区别是什么......看起来他们最终都阻止了一个实例进入数据库 - 我是否会从包含两条线路中受益?
答案 0 :(得分:1)
但实际上,这里的区别是什么......
差别是绝对的:)你将逻辑隔离到它所属的位置。
Exam
模型中的内容仅涉及Exam
模型。
您在Student
模型中定义的内容仅涉及Student
模型。
这就是说,您已经通过了reject_if
模型中的Student
并允许保存交易继续前进。如果嵌套对象的模型(Exam
中的验证失败,它根据定义是独立的),它将不会保存嵌套对象。
我会从包括两条线中受益吗?
在Exam
模型中进行验证可以避免将无效对象保存到db中,并且它与验证Student
模型中的嵌套对象创建无关。
无论如何,这些东西是分开的,不同的,没有联系。