2012-12-01 105 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在每個部門都是唯一的,我們使用範圍。

通過這樣做,我們可以確保沒有兩名具有相同電子郵件地址的員工在同一個部門工作。我們也可以找出特定員工工作的所有部門。

簡而言之,使用範圍的唯一性驗證適用於兩個屬性(電子郵件,我們的案例中的部門)。