如何validation关联的模型ID?

我有一个学生和一个课程模型。 学生属于课程,课程有很多学生。

class Student true validates_associated :course end class Course  true validates :courseCode,:courseYr, :uniqueness=>{:message=>"Cannot repeat the code"} has_many :students end 

在用于创建学生记录的表单中,我让用户输入课程ID。

 

但我不知道如何validation用户输入的course_id 。 即使我键入不存在的课程ID,学生模型validation也不会生成错误。 如何让它显示错误?

您应该考虑创建自定义validation方法:

 class Student < ActiveRecord::Base validates :course_id, presence: true, numericality: { only_integer: true } ... validate :validate_course_id private def validate_course_id errors.add(:course_id, "is invalid") unless Course.exists?(self.course_id) end end 

首先,您的模型将确保course_id是一个有效的整数,然后您的自定义validation将确保该课程存在于数据库中。

您可以validation课程关联的存在。 那么,如果不存在,有效吗? 将是假的。

你的课应该是:

 class Student < ActiveRecord::Base attr_accessible :course_id, :name, :password, :status, :studentID, :year belongs_to :course validates :course, :name, :password, :status, :studentID, :year, presence: true end 

本文解释了validation外键和关联本身的区别。

如果您不需要validation当然的存在,则可以执行此解决方法:

 validates :course, presence: true, if: -> {course_id.present?} 

您可以执行自定义validation方法来检查课程ID的有效性:

 # course.rb validates :course_id_is_valid def course_id_is_valid if #course id isn't valid errors.add(:course_id, "is invalid") end end 

或者,如果课程列表是离散列表,则可以在validation时使用:in选项:

 # course.rb validates :course_id, :inclusion => { :in => list_of_courses, :message => "%{value} is not a course id" } 

还有更多选择。 这两个示例都来自Rails文档:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-methods