2015-06-17 51 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