假设我有很多学校,很多学生和很多俱乐部。 学生可以去一所或多所学校。 学校可以有任意数量的俱乐部。
学生可以加入俱乐部,只要他们目前在俱乐部所属的学校注册。
我很想在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
问题是基于事物的创建或持续的顺序,或者如果学生被添加到俱乐部或俱乐部添加到学生,验证可以与零学生或零俱乐部一起运行。或者显然它可能无法通过验证但仍然存在。
处理此类验证的最佳方法是什么?
答案 0 :(得分:0)
最近(从Rails 3.2.13开始),如果在运行验证之前它们尚未保留,Rails将保存关系的两端。 所以它们不会为空,它们看起来会持久存在。 Rails在事务中执行此操作,因此如果验证失败,您将不会最终得到持久对象。
在以前版本的Rails中,相关的值在关系的验证方法中可能显示为nil。
从3.2.13开始,这使编码验证更加简单明了。 对于'TINY'版本来说,这似乎是一个重大变化。确保相关代码经过充分测试。