2011-04-24 7 views
18

Tengo una clase de usuario y un contacto donde el contacto es una subclase de usuario. Ambas clases se almacenan en una tabla de usuarios.Rieles - Omita la validación de rieles para la subclase

Mis contactos pueden tener o no una dirección de correo electrónico, mientras que una dirección de correo electrónico es necesaria para mis usuarios (tengo validates_presence_of :email en la definición de mi modelo de usuario).

Mi razonamiento es que los contactos son ingresados ​​por los usuarios y más tarde pueden convertirse en usuarios cuando reclaman su perfil.

  • En primer lugar, ¿está bien definir mis contactos y usuarios de la manera en que lo hice?
  • En segundo lugar, ¿cómo omito la validación en mi modelo de contactos?

(Estoy en los carriles 2.3.8)

Gracias!

ACTUALIZACIÓN:

  • Parece herencia de tabla única se diseñado para hacer exactamente lo que necesitaba

  • de la manera correcta para omitir la validación de la presencia de correo electrónico para mi contacto tabla es como sigue:

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

+1

En caso de no ser usuario de una subclase de contacto? Me parece que un Usuario * es un * Contacto que se registró. Pero un contacto no es necesariamente un usuario. Esto también resolvería su problema de validación, ya que la validación iría en el modelo de Usuario, negando la necesidad de una cláusula: unless. – Raphael

Respuesta

22

Parece que debe abstraer el usuario y los contactos en dos tablas en lugar de intentar consolidarlos en uno. Aunque los contactos pueden convertirse en usuarios, eso no significa que lo hagan (¿no?).

Esto también resolvería su pregunta validate_presence_of :email, ya que la mesa/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 una tonelada de contactos para clasificar para encontrar un usuario registrado.

Si eres-empeñado en hacerlo en una mesa sin embargo, creo que se puede hacer algo como lo siguiente:

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

esto es suponiendo que usted tiene una columna user_type, pero podría reemplazar eso dependiendo de cómo se determina si un User es un Contact.

actualización:

Ésta es la forma en que te validar correctamente los modelos: Retire la validates_presence_of del modelo y colocarlo dentro de este bloque:

with_options :unless => :user_type == "contact" do |user| 
    user.validates_presence_of :email 
end 
+0

Actualmente tengo un campo "user_type" en mi tabla de usuarios que dice si la fila es para un usuario o un contacto. Tener ambos en la misma tabla me facilita la transformación de un contacto en un usuario cuando reclaman su perfil. Y todos los campos son similares, solo la validación en el correo electrónico es diferente. Es por eso que me gustaría usar la misma tabla. Cualquier pista sobre cómo podría evitar la validación del campo de correo electrónico (alternativamente, puedo hacer Contact.save (falso), pero omite todas las validaciones, no solo el correo electrónico. – alex

+0

Entiendo eso y no es necesariamente una mala forma de A mi entender, los usuarios podrían tener cientos de contactos que no necesariamente serían usuarios registrados. Si su sitio creció a 100.000 usuarios, piense en las implicaciones de rendimiento de consolidar eso en una sola tabla. Aunque actualmente no es un problema, sería más una molestia cambiarlo si eso ocurriera, entonces solo hacer el cambio de diseño ahora. Básicamente, está intercambiando más llamadas de bases de datos por no tener una tabla potencialmente enorme. –

+0

Además, vea mi respuesta actualizada. La 'validates_presence_of : correo electrónico a menos ... 'poco debería funcionar, si la memoria me sirve correctamente. –

Cuestiones relacionadas