2015-06-17 79 views
0

基於this previous question that I asked,我明白在布爾型字段上使用標準範圍唯一性是不可能的。使用布爾值必須使用包含驗證,但是我無法弄清楚如何將該包含範圍限定在表中的另一個字段。Rails驗證:布爾型上的範圍唯一性

下面是我能想到的最簡單的方式來描述它。

我有app_settingsapp_setting_options表。 app_settings取給定的app_option_optionuser_id,user_role_id,group_id,event_idapp_level。它們都具有有限範圍的唯一性驗證,因此只能有一條記錄與特定的user_id和特定的app_setting_option。問題是app_level字段是一個布爾值,我不知道如何將該唯一性(true或false)限制到app_setting_option

這裏是我的驗證如現在:

validates :app_setting_option_id, presence: true 
validates :user_id, uniqueness: { scope: :app_setting_option_id}, allow_nil: true 
validates :user_role_id, uniqueness: { scope: :app_setting_option_id}, allow_nil: true 
validates :group_id, uniqueness: { scope: :app_setting_option_id}, allow_nil: true 
validates :event_id, uniqueness: { scope: :app_setting_option_id}, allow_nil: true 
validates :app_level_setting, inclusion: { in: [true, false] }, allow_nil: true 

什麼是語法的唯一性與該最後一個範圍?

回答

0

我可能會被誤讀的問題,但如果你想允許一個app_setting與給定user_idapp_level_settingtrue,和一個app_setting與給定user_idapp_level_settingfalse,你可以使用數組的scope,像scope: [:app_setting_option_id, :app_level_setting]

如果你想app_level_setting有類似休息的範圍,你可能不得不做手工,喜歡的東西validate :app_level_setting_scope和創建方法app_level_setting_scope如果記錄不是唯一的添加錯誤。你必須自己做查詢和邏輯。

Rails guides有關於如何執行此操作的一些文檔。

+0

對不起,我看到一些混亂。使用給定的app_setting_option,將只有user_id,user_role_id,event_id,group_id或app_level_setting中的一個。這就是爲什麼這很奇怪,因爲對於前4個字段,提供了一個id,但對於app_level_setting,它是true或false。這是否更有意義? –

+0

是的,然後選項2應該工作。 創建一個被調用的自定義驗證方法,如果其中任何一個ID字段被填充,讓它返回而不做任何事情,並且如果它們中沒有一個是,請檢查以確保'app_level_setting'對於給定的'app_setting_option_id'是唯一的。 – PerfectlyNormal