2012-12-01 161 views
6

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

甚至多个范围参数。例如,确保 级别的教师每学期只能安排一次。

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

我对此的理解是,我可以有一个教师在同一学期教两个班,但不是同一类的,我可以有一个教师的教学在不同学期同一类。它是否正确?所有3个字段必须匹配一些现有的记录才能验证失败?

有没有一种方法来验证它,以便它失败,如果semester_id或class_id匹配?

+1

为什么不添加两个验证,每个都有不同的范围? –

回答

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 
+0

不,它在文档示例的上下文中没有意义。只是想知道如何去做。 – mushroom

0

我只是来了解如何验证工作的独特性与范围,我想与大家分享。

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

通过这样做,我们可以确保没有两名具有相同电子邮件地址的员工在同一个部门工作。我们也可以找出特定员工工作的所有部门。

简而言之,使用范围的唯一性验证适用于两个属性(电子邮件,我们的案例中的部门)。