Как использовать проверку рельсов для атрибута, предоставленного динамически из связанного объекта - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть User модель с полями БД от field1 до field10, и одна из них - поле электронной почты.

Я хочу подтвердить это, как показано ниже,

validates :field1,
          format: { .. },
          if: Proc.new{ |i| i.active? }

Но моя проблема в том, что я не знаю, какое поле электронной почты, и оно зависит от UserStructure объекта, имеющего поле db как email_field, что указывает на то, какое поле электронной почты в User таблице

validates Proc.new{ |i| i.user_structure.email_field },
          format: { .. },
          if: Proc.new{ |i| i.active? }

Но выше не работает и self всегда будет классом User (при загрузке валидации для класса User)

Пожалуйста, исправьте меня или предложите, если есть какая-либо альтернатива. Заранее спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

Вам нужна пользовательская проверка :

class User < ApplicationRecord
  validate :user_email_should_be_valid

  def user_email_should_be_valid
    email_field = user_structure.email_field
    email = send(email_field)

    if active? && !email.match?(EMAIL_REGEXP)
      errors.add(email_field.to_sym, "should be a valid email address")
    end
  end
end
...