2012-05-28 7 views
5

Ich habe ein Modell mit einem serialisierten Attribut (Array). Ich möchte das Modell nur dann validieren, wenn jedes Element des Arrays in den vorgegebenen Optionen enthalten ist.Wie führe ich eine Inklusionsvalidierung für ein serialisiertes Attribut durch?

Beispiel: Ich habe ein Personenmodell, das ein Attribut "Stimmung" hat. Benutzer können mehr als eine Stimmung haben, aber jede Stimmung muss entweder "glücklich", "traurig", "müde" oder "wütend" sein.

Das Modell wäre so etwas wie dieses:

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

    attr_accessible :mood 
    serialize :mood 
end 

Die kommentierte Validierung nicht funktioniert. Gibt es eine Möglichkeit, es funktioniert oder brauche ich eine benutzerdefinierte Validierung?

(. Hinweis: Ich habe keine separates Mood Modell erstellen mag)

Antwort

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

Prüfen Sie diese Dokumentation, http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion. Sie müssen keine benutzerdefinierten Validierungen dafür erstellen. – Chamnap

+0

auf serialisierten Attributen, Sie tun, sonst wird der serialisierte Wert für die Einbeziehung überprüft, was bedeutet, dass Stimmung = [müde, wütend] wird fehlschlagen, da MOODS.include? (Stimmung) ist falsch –

+0

Ah, ich habe nicht serialize-Methode zu sehen. Ihre Antwort sollte dann stimmen. – Chamnap

2

dieses Weggehen hier falls hilft es jemand in der Zukunft - Ich habe ein Juwel geschrieben besser zu handhaben serialisierten Validieren Attribute. Sie können nur diese Validierungen in einem Block Syntax gesetzt, die Möglichkeiten, wie Sie erwarten könnten:

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

Verwandte Themen