Rails - Пропустить валидацию для подкласса - PullRequest
18 голосов
/ 25 апреля 2011

У меня есть класс пользователя и контакт, где контакт является подклассом пользователя.Оба класса хранятся в таблице пользователей.

Мои контакты могут иметь или не иметь адрес электронной почты, в то время как адрес электронной почты требуется для моих пользователей (у меня есть validates_presence_of :email в моем определении модели пользователя).

Я полагаю, что контакты вводятся пользователями и могут впоследствии стать пользователями, когда они заявят о своем профиле.

  • Прежде всего, можно ли определять моих пользователей и контакты так, как я это сделалэто?
  • Во-вторых, как мне пропустить проверку validate_presence_of email в моей модели контактов?

(я на рельсах 2.3.8)

Спасибо!

ОБНОВЛЕНИЕ:

  • Кажется, что наследование одной таблицы предназначено для выполнения именно того, что мне нужно

  • правильный путь кпропустить проверку наличия электронной почты для моей таблицы контактов следующим образом:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

1 Ответ

22 голосов
/ 25 апреля 2011

Похоже, вам следует абстрагировать пользователя и контакты в две таблицы, а не пытаться объединить их в одну. Хотя контакты могут стать пользователями, это не значит, что они будут (я думаю?).

Это также решило бы ваш вопрос validate_presence_of :email, поскольку у таблицы / модели контактов даже не было бы поля. Я считаю, что это также уменьшит потенциальные проблемы с производительностью позже. Вы не хотите иметь тонну контактов, чтобы разобраться, чтобы найти зарегистрированного пользователя.

Если вы намерены сделать это в одной таблице, я думаю, вы можете сделать что-то вроде следующего:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

Предполагается, что у вас есть столбец user_type, но вы можете заменить его в зависимости от того, как вы определяете, является ли User Contact.

Обновление

Вот как вы должны правильно проверить модели: удалите validates_presence_of из модели и поместите его внутри этого блока:

with_options :unless => :user_type == "contact" do |user|
   user.validates_presence_of :email
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...