Подтвердить что ты не робот

Rails - проверка откатных направляющих для подкласса

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

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

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

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

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

Спасибо!

UPDATE:

  • Кажется, что одностраничное наследование чтобы сделать то, что мне нужно

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

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

4b9b3361

Ответ 1

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

Это также решит ваш вопрос 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