基於this previous question that I asked,我明白在布爾型字段上使用標準範圍唯一性是不可能的。使用布爾值必須使用包含驗證,但是我無法弄清楚如何將該包含範圍限定在表中的另一個字段。Rails驗證:布爾型上的範圍唯一性
下面是我能想到的最簡單的方式來描述它。
我有app_settings
和app_setting_options
表。 app_settings
取給定的app_option_option
和user_id
,user_role_id
,group_id
,event_id
或app_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
什麼是語法的唯一性與該最後一個範圍?
對不起,我看到一些混亂。使用給定的app_setting_option,將只有user_id,user_role_id,event_id,group_id或app_level_setting中的一個。這就是爲什麼這很奇怪,因爲對於前4個字段,提供了一個id,但對於app_level_setting,它是true或false。這是否更有意義? –
是的,然後選項2應該工作。 創建一個被調用的自定義驗證方法,如果其中任何一個ID字段被填充,讓它返回而不做任何事情,並且如果它們中沒有一個是,請檢查以確保'app_level_setting'對於給定的'app_setting_option_id'是唯一的。 – PerfectlyNormal