ruby-on-rails - validates_uniqueness_of - rails validations message
Rieles-validaciĆ³n de rieles de riel para subclase (1)
Tengo una clase de Usuario y un Contacto donde Contacto es una subclase de Usuario. Ambas clases se almacenan en una tabla de usuarios.
Mis contactos pueden o no tener una dirección de correo electrónico, mientras que para mis usuarios se requiere una dirección de correo electrónico (tengo validates_presence_of :email
en la definición de mi modelo de usuario).
Mi razonamiento es que los Contactos ingresan a los Contactos y luego pueden convertirse en Usuarios cuando reclaman su perfil.
- En primer lugar, ¿está bien definir a mis usuarios y contactos como lo hice?
- En segundo lugar, ¿cómo puedo omitir la
validate_presence_of email
en mi modelo de contactos?
(Estoy sobre rieles 2.3.8)
¡Gracias!
ACTUALIZAR:
Parece que la herencia de una sola tabla está diseñada para hacer exactamente lo que necesitaba
La forma correcta de omitir la validación de la presencia de correo electrónico en mi tabla de contactos es la siguiente:
validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}
Parece que debes abstraer al Usuario y a los Contactos en dos tablas en lugar de tratar de consolidarlos en una sola. Aunque los contactos pueden convertirse en usuarios, eso no significa que lo harán (¿creo?).
Esto también resolvería tu pregunta de validate_presence_of :email
, ya que la tabla / modelo de contacto ni siquiera tendría el campo. También aliviaría posibles problemas de rendimiento más adelante, creo. No querría tener un montón de contactos para buscar un usuario registrado.
Sin embargo, si estás decidido a hacerlo en una mesa, creo que puedes hacer algo como lo siguiente:
validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}
Esto es asumiendo que usted tiene una columna de tipo de usuario, pero podría reemplazarla dependiendo de cómo determine si un User
es un Contact
.
Actualización :
Así es como validaría correctamente los modelos: elimine validates_presence_of
del modelo y colóquelo dentro de este bloque:
with_options :unless => :user_type == "contact" do |user|
user.validates_presence_of :email
end