对 Rails 的字段进行有条件的验证
class Exam < ApplicationRecord
validates :title, presence: true
validates :subject_id, presence: true, if: :no_exam_type?
belongs_to :subject
def no_exam_type?
!self.exam_type.present?
end
end
想实现对 exam
的 subject_id
进行验证
当 exam_type
字段为空时,subject_id
一定要存在
而当 exam_type
字段不为空时,subject_id
不用存在
但上面的写法一直不能成功。
通过 rails c
去测试 Exam.create!(title: "title test", exam_type: "test")
一直报错:
ActiveRecord::RecordInvalid: 验证失败: Subject 不能为空
给 belongs_to
加上 optional: true
因为:
4.1.2.11 :optional If you set the :optional option to true, then the presence of the associated object won’t be validated. By default, this option is set to false.
默认情况下, belongs_to
是一定要存在的,也即 optional: false
所以将代码修改如下,即可:
# exam.rb
class Exam < ApplicationRecord
validates :title, presence: true
validates :subject_id, presence: true, if: :no_exam_type?
belongs_to :subject, optional: true
def no_exam_type?
!self.exam_type.present?
end
end