You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,比如student Factory包含belongs_to :course的关联定义。

内容的提问来源于stack exchange,提问作者David Hempy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:37:38