什么是Rails方式来验证必须就属性达成一致的多对多关系的结束?

时间:2013-05-27 18:42:39

标签: ruby-on-rails activerecord

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

学生可以加入俱乐部,只要他们目前在俱乐部所属的学校注册。

我很想在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

问题是基于事物的创建或持续的顺序,或者如果学生被添加到俱乐部或俱乐部添加到学生,验证可以与零学生或零俱乐部一起运行。或者显然它可能无法通过验证但仍然存在。

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

1 个答案:

答案 0 :(得分:0)

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

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

从3.2.13开始,这使编码验证更加简单明了。 对于'TINY'版本来说,这似乎是一个重大变化。确保相关代码经过充分测试。