2015-06-17 2 views
0

Основываясь на this previous question that I asked, я понимаю, что невозможно использовать стандартную ограниченную уникальность в булевом поле. С логическим вы должны использовать проверку включения, но тогда я не могу понять, как включить эту область в другое поле в таблице.Проверка правильности: ограниченная уникальность на логическом уровне

Вот самый простой способ, который я могу описать.

У меня есть 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 

Что такое синтаксис для уникальности с областью для этого последнего?

ответ

0

я мог бы быть неправильно понимает вопрос, но если вы хотите, чтобы один app_setting с заданной user_id когда app_level_setting является true, и один app_setting с заданной user_id когда app_level_setting является false, вы можете использовать массив для 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 полей есть идентификатор, но для app_level_setting он либо истинный, либо ложный. Это имеет смысл? –

+0

Да, тогда вариант 2 должен работать. Создайте собственный метод проверки, который вызывается, возвратите его без каких-либо действий, если заполняется любое из полей идентификатора, и если ни один из них не указан, сделайте свой чек, чтобы убедиться, что 'app_level_setting' уникален для данного' app_setting_option_id' , – PerfectlyNormal

Смежные вопросы