多范围唯一性验证

时间:2012-12-01 20:15:47

标签: ruby-on-rails activerecord

我想澄清多范围唯一性验证的行为。 documentation说:

  

甚至多个范围参数。例如,确保a   教师每学期只能按照计划进行一次   类。

class TeacherSchedule < ActiveRecord::Base
  validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
end

我对此的理解是,我可以让一位老师在同一学期教授两门课,但课程不同,我可以让一位老师在不同的学期教授同一节课。它是否正确?所有3个字段必须匹配某些现有记录才能使验证失败?

有没有办法验证它,如果semester_id或class_id匹配,它会失败?

2 个答案:

答案 0 :(得分:9)

  

我对此的理解是,我可以让一位老师在同一学期教授两门课,但课程不同,我可以让一位老师在不同的学期教授同一节课。它是否正确?所有3个字段必须匹配某些现有记录才能使验证失败?

是的,这是正确的。关于它“对于scope的每个独特价值,该字段只能出现一次。”当scope是数组时,“范围的唯一值”是字段值的组合。

  

有没有办法验证它,如果semester_id或class_id匹配,它会失败?

所以老师一个学期不应该教两次,也不应该教同一个班,即使是在不同的学期?这似乎不对,但你可以通过每个验证来做到这一点:

class TeacherSchedule < ActiveRecord::Base
  validates_uniqueness_of :teacher_id, :scope => :semester_id
  validates_uniqueness_of :teacher_id, :scope => :class_id
end

答案 1 :(得分:0)

我刚刚了解了唯一性验证如何与范围一起使用,我想与大家分享。

如果您在组织中有多个部门,并且任何员工同时也可以属于两个或更多部门,请说。为了确保员工的电子邮件ID在每个部门中都是唯一的,我们使用范围。

通过这种方式,我们可以确保没有两个具有相同电子邮件地址的员工在同一个部门工作。此外,我们还可以找到特定员工所在的所有部门。

简单来说,带范围的唯一性验证适用于两个属性(在我们的案例中是电子邮件,部门)。