Rails 模型与两个具有共同祖父母的模型相关......如何创建验证和工厂?

Rails model related to two models with a common grandparent...how to create a validation and factory?

提问人:David Hempy 提问时间:5/10/2023 更新时间:5/10/2023 访问量:22

问:

我有一个提交模型,belongs_to两个不同的模型:学生和测验。

学生和测验分别belong_to一门课程。

当学生发送测验提交时,假定该测验必须与学生所在的课程相同。我想为此写一个验证。

第一个问题:如何编写验证以确保两个相关记录(Student 和 Quiz)具有相同的共同父项?

第二个问题:我怎样才能创建一个提交工厂,当没有给出任何参数时,它将创建一个通过该验证的提交?

Ruby-on-Rails 验证 ActiveRecord 工厂机器人

评论


答:

0赞 David Hempy 5/10/2023 #1

对于模型验证,我使用了:

class Submission < ApplicationRecord
  belongs_to :student
  belongs_to :quiz
  
  validate :same_course

  def same_course
    if quiz.course != student.course
      errors.add(:quiz, "must be for the student's course")
    end
  end
end

这合理吗?有没有一种更像 Rails 的方式来表达这一点?

0赞 David Hempy 5/10/2023 #2

对于工厂来说,

FactoryBot.define do
  factory :submission do
    transient do
      course { create :course }
    end

    student { create :student, course: course }
    quiz { create :quiz, course: course }
  end
end

这样,我就可以在不设置任何其他记录的情况下创建提交:

FactoryBot.create :submission

如果我手头已经有一门课程,我可以用它来代替:

FactoryBot.create :submission, course: my_course

当然,我也可以通过学生和/或测验......尽管随后呼叫者承担了共同课程的父母责任。

这有一个次优的副作用,即当你......但我可以忍受。build :submission