mausspb
@mausspb
web разработчик, системный администратор

Валидация в Rails, как сделать запрос в соседнее поле?

Провожу валидацию в модели введенных данных:

#app/models/validate.rb
validates :email, :presence=> true,
:format=> VALID_EMAIL_REGEX,
:uniqueness=> true

Не могу понять, как сделать доп. запрос в БД в ту же таблицу в соседнее поле, но которое не участвует при наборе формы (тут в модель передается результаты ввода формы params[:subscribtion]) ) ?

Задача : проверить email на уникальность ( что сделано выше ), а так же проверить что в соседнем поле subscribe - значение true .
subscribe не участвует при вводе.

Все кручусь вокруг has_one, но не могу понять как правильно заюзать .
Так же мне нужно видимо юзать объединение условий валидации, но с этим позже, пока не могу понять как сделать запрос в соседнее поле.

UPD:
Сейчас запрос такой
SELECT 1 FROM `subscriptions` WHERE (`subscriptions`.`email` = BINARY 'newmail@mail.com') LIMIT 1

а надо
SELECT 1 FROM `subscriptions` WHERE (`subscriptions`.`email` = BINARY 'newmail@mail.com') AND (`subscriptions`.'subscribe' = '1') LIMIT 1
  • Вопрос задан
  • 439 просмотров
Пригласить эксперта
Ответы на вопрос 2
ibub1ik
@ibub1ik
Ruby/Rails Dev => Elixir
Не совсем понял что ты хочешь сделать. Но чтоб получить требуемый запрос, сделай так:
validates :email, uniqueness: { scope: :subscribe }, if: :subscribe?

Так валидация будет запускаться только если в поле subscribe значение true. Если нужно так же проверять, что subscribe всегда true, то есть такой вариант:
validates :subscribe, inclusion: { in: [true] }

Мне он не очень нравится. Лучше задуматься над кастомным валидатором или методом валидации.
Ответ написан
@Orky
"а надо
SELECT 1 FROM `subscriptions` WHERE (`subscriptions`.`email` = BINARY 'newmail@mail.com') AND (`subscriptions`.'subscribe' = '1') LIMIT 1" - запрос неверный, потому что может быть два мыла в базе, одно со включенной подпиской, одно с выключенной.

А насчет валидации согласен с ibub1ik - лучше сделать отдельным классом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы