Основываясь на 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
Что такое синтаксис для уникальности с областью для этого последнего?
Извините, я вижу некоторое замешательство. При заданном app_setting_option будет только ОДИН из user_id, user_role_id, event_id, group_id или app_level_setting. Вот почему это странно, потому что для этих первых 4 полей есть идентификатор, но для app_level_setting он либо истинный, либо ложный. Это имеет смысл? –
Да, тогда вариант 2 должен работать. Создайте собственный метод проверки, который вызывается, возвратите его без каких-либо действий, если заполняется любое из полей идентификатора, и если ни один из них не указан, сделайте свой чек, чтобы убедиться, что 'app_level_setting' уникален для данного' app_setting_option_id' , – PerfectlyNormal