Похоже, вам следует абстрагировать пользователя и контакты в две таблицы, а не пытаться объединить их в одну. Хотя контакты могут стать пользователями, это не значит, что они будут (я думаю?).
Это также решило бы ваш вопрос 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