1

假设我有很多学校、很多学生和很多俱乐部。一个学生可以去一所或多所学校。一所学校可以有任意数量的俱乐部。

只要学生当前就读于俱乐部所属的学校,就可以将其添加到俱乐部。

我很想在 ClubStudent 加入课程中做这样的事情

class ClubStudent < ActiveRecord::Base
  belongs_to: student
  belongs_to: club

  validate: student_school_matches_club_school

  def student_school_matches_club_school
    unless student.schools.member? club.school
      self.errors.add(:student, "must be enrolled in club's school")
    end
  end
end

问题是基于事物如何创建或持久化的顺序,或者如果将学生添加到俱乐部或将俱乐部添加到学生,则可以使用 nil 学生或 nil 俱乐部运行验证。或者显然它可能无法通过验证,但仍会持续存在。

处理此类验证的最佳方法是什么?

4

1 回答 1

0

最近(从 Rails 3.2.13 开始),Rails 将保存关系的两端,如果它们在验证运行之前还没有持久化。所以它们不会为空,它们看起来会持久化。Rails 在事务中执行此操作,因此如果验证失败,您将不会得到持久对象。

在以前的 Rails 版本中,相关的值在关系的验证方法中可能显示为 nil。

从 3.2.13 开始,这使得编码验证更加直接。这似乎是“TINY”版本凹凸的重大变化。确保相关代码经过良好测试。

于 2013-06-06T15:17:05.900 回答