2012-01-05 10 views
7

Necesito realizar la validación para asegurarme de que solo un usuario dentro de una empresa puede existir dentro de una categoría determinada.ActiveRecord validate: uniqueness on association

validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Esto funciona, excepto el mensaje de error se encuentra en :user_id clave.

¿Cómo puedo hacer lo mismo pero configurar el error en la clave :user (validates :user da un error)?

+0

'valida: usuario,: ​​unicidad => {...} '? – Frost

+0

posible duplicado - http://stackoverflow.com/questions/8479113/rails-3-1-custom-validation-message-on-join-table-of-has-many-through-relations/8479323#8479323 – maprihoda

+0

@Martin He mencionado en la pregunta que plantea el error. El duplicado sugerido es una pregunta totalmente diferente. –

Respuesta

7

He aquí una forma sencilla de comprobar la singularidad y forzar el error que se asignará al atributo :user:

class User < ActiveRecord::Base 
    validate :user_unique_per_company_per_category 

    private 

    def user_unique_per_company_per_category 
    if self.class.exists?(:user_id => user_id, :company_id => company_id, :category => category) 
     errors.add :user, 'already exists' 
    end 
    end 
end 

Sería preferible, creo, si pudiera encontrar una forma de usar la validación por defecto en :user_id, pero tal vez tenga un caso de uso especial.

Además, si no se está usando esto en una forma, es posible considerar asignar el error a :base, ya que podría confundir a los desarrolladores de futuros que esperan que aparezca el error en :user_id:

errors.add :base, 'already exists' 
+0

Sí, la validación de custome hasta ahora es probablemente la mejor opción. No puedo creer que no pueda aplicar esta validación al usuario :(El problema con la validación de user_id es que nunca se usa en la interfaz de usuario, por lo que el mensaje de error que mencionó no estará en el lugar correcto. –

-1

No creo que esto sea posible ya que el método valida de ActiveRecord envía los errores al método que se está validando.

Lo valida: el usuario intenta enviar al attr_accessor de: usuario que no existe en su modelo.

embargo, si usted está tratando de hacer que el mensaje de error bastante puede:

alias user user_id 

y luego usar: el usuario en su validación.

validates :user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

En una nota, yo no usaría usuario en el alias bien algo así como:

alias the_supplied_user user_id 

Y luego, en su validación:

validates :the_supplied_user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 
+1

Bueno, tanto el usuario como el user_id existen, ya que es una asociación. Entonces el alias simplemente romperá todo. –

Cuestiones relacionadas