2012-05-28 24 views
5

Tengo un modelo con un atributo serializado (matriz). Me gustaría validar el modelo solo si cada miembro de la matriz está incluido dentro de las opciones predeterminadas.¿Cómo realizar una validación de inclusión en un atributo serializado?

Ejemplo: Tengo un modelo Persona que tiene un atributo "estado de ánimo". Los usuarios pueden tener más de un estado de ánimo, pero cada estado de ánimo debe ser "feliz", "triste", "cansado" o "enojado".

El modelo sería algo como esto:

class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    # validates :inclusion => { :in => MOODS } 

    attr_accessible :mood 
    serialize :mood 
end 

La validación comentado no funciona. ¿Hay alguna forma de hacerlo funcionar o necesito una validación personalizada?

(. Nota: Yo no quiero crear un modelo del estado de ánimo por separado)

Respuesta

8
class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    validate :mood_check 
    attr_accessible :mood 
    serialize :mood 

protected 
    def mood_check 
    mood.each do |m| 
     errors.add(:mood, "#{m} is no a valid mood") unless MOODS.include? m 
    end 
    end 

end 
+0

Comprobar esta documentación, http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion. No es necesario crear validaciones personalizadas para eso. – Chamnap

+0

en atributos serializados, de lo contrario, el valor serializado se comprueba para su inclusión, lo que significa que mood = [cansado, enojado] fallará ya que MOODS.include? (Mood) es falso –

+0

Ah, no vi el método de serialización. Tu respuesta debería ser correcta entonces. – Chamnap

2

Dejando esto aquí en caso de que ayuda a cualquier persona en el futuro - He escrito una joya para manejar mejor la validación serializado atributos. Usted puede simplemente poner esas validaciones en un bloque de sintaxis, las formas en que se podría esperar:

class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    attr_accessible :mood 
    serialize :mood 

    validates_array_values :mood, inclusion: { in: MOODS } 
end 

https://github.com/brycesenz/validates_serialized

Cuestiones relacionadas