Rails中关联同祖父模型的验证规则及Factory创建方法咨询
问题1:验证Student和Quiz同属一个Course的实现
在Submission模型中添加自定义验证方法,通过比较关联对象的course_id来确保一致性:
# app/models/submission.rb class Submission < ApplicationRecord belongs_to :student belongs_to :quiz validate :student_and_quiz_share_same_course private def student_and_quiz_share_same_course # 避免空对象引发错误 return if student.blank? || quiz.blank? unless student.course_id == quiz.course_id errors.add(:base, "学生与测验必须归属同一课程") # 也可针对具体字段添加错误提示,比如: # errors.add(:student, "需与测验归属同一课程") # errors.add(:quiz, "需与学生归属同一课程") end end end
这个验证会在保存Submission时触发:如果student或quiz未关联,会跳过验证(也可根据需求额外添加presence: true验证确保两者都存在);如果两者的course_id不匹配,会添加错误信息并阻止保存。
问题2:创建通过验证的Submission Factory
使用FactoryBot时,先创建共享的Course实例,再基于该Course生成Student和Quiz,最后关联到Submission,确保默认生成的实例符合验证规则:
# spec/factories/submissions.rb FactoryBot.define do factory :submission do # 先创建一个课程实例 course { create(:course) } # 基于上述课程创建学生和测验 student { create(:student, course: course) } quiz { create(:quiz, course: course) } end end
这样调用create(:submission)或build(:submission)时,Factory会自动生成归属同一课程的Student、Quiz和Submission实例,无需额外参数即可通过验证。
注:前提是你已经定义了
course、student、quiz的基础Factory,比如studentFactory包含belongs_to :course的关联定义。
内容的提问来源于stack exchange,提问作者David Hempy
相关产品推荐
相关产品推荐

