Пропустить проверку уникальности для нулевого класса Rails 3 - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я не могу создать пустое поле со значением nil, потому что nil считается уникальным.Я хочу сделать, если поле имеет значение, то оно должно быть уникальным, если ноль, то нет, а также он не может возвращать пустое строковое значение.

Это моя проверка:

validates :subdomain, :allow_nil => true, uniqueness: true

Обновление

При этой проверке я получаю сообщение об ошибке:

Субдомен не может быть пустым

  validates_uniqueness_of :subdomain, presence: true, allow_nil: true, if: -> (x) { x.subdomain.present? }

Без "Наличие: true "в консоли, я могу создать запись со значением субдомена nil, но если я делаю это в браузере, он создает субдомен с пустой строкой.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Мое решение:

метод создания контроллера

@organisation = Organisation.new(params[:organisation].delete_if{ |key, value| !value.present? })

и в модели:

validates   :subdomain, :allow_nil => true, uniqueness: true
0 голосов
/ 18 октября 2018

Как сказал @Pavan в комментарии, вам нужно выполнить эту проверку условно.

Из-за опции :allow_nil, nil является допустимым значением;тем не менее, он все равно будет запускать тест уникальности для этого значения, если вы не добавите дополнительную проверку.

Я бы использовал следующий код:

validates :subdomain, allow_nil: true, uniqueness: true, if: -> (x) { x.subdomain.present? }

Вскоре я чувствую, что present?хороший, читаемый способ включения этого.

С этим, я на 99% уверен, что вы также сможете покончить с опцией :allow_nil, используя просто:

validates :subdomain, uniqueness: true, if: -> (x) { x.subdomain.present? }

Надеюсь, что это поможет - дайте мне знать, как у вас обстоят дела или если у вас есть какие-либо вопросы.


Редактирование на основе комментариев, вот пример отклонения пустых строк:

validates :subdomain, allow_nil: true, uniqueness: true, presence: true, if: :subdomain
# or
validates :subdomain, uniqueness: true, presence: true, if: :subdomain

Опять же, не думайте, что вам понадобится :allow_nil там: я обновил условное обозначение, поэтому проверка выполняется просто на record.subdomain, который вернет true для пустой строки, false для nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...