2012-05-28 13 views
5

Ho un modello con un attributo serializzato (array). Vorrei convalidare il modello solo se ogni membro dell'array è incluso nelle opzioni predeterminate.Come eseguire una convalida di inclusione su un attributo serializzato?

Esempio: Ho un modello Persona che ha un attributo "mood". Gli utenti possono avere più di uno stato d'animo, ma ogni umore deve essere "felice", "triste", "stanco" o "arrabbiato".

Il modello sarebbe qualcosa di simile:

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

    attr_accessible :mood 
    serialize :mood 
end 

La convalida commentato non funziona. C'è un modo per farlo funzionare o ho bisogno di una convalida personalizzata?

(. Nota: io non voglio creare un modello Mood separata)

risposta

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

Controllare questa documentazione, http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion. Non è necessario creare convalide personalizzate per questo. – Chamnap

+0

su attributi serializzati, altrimenti, il valore serializzato viene controllato per l'inclusione, il che significa che l'umore = [stanco, arrabbiato] fallirà poiché MOODS.include? (Mood) è false –

+0

Ah, non ho visto il metodo serialize. La tua risposta dovrebbe essere proprio allora. – Chamnap

2

Lasciando questo qui, in caso aiuta chiunque in futuro - ho scritto una gemma per gestire meglio la convalida serializzato attributi. Si può solo mettere quelle convalide in una sintassi di blocco, i modi si potrebbe aspettare di:

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

Problemi correlati