2012-05-28 38 views
5

我有一個序列化屬性(數組)的模型。我只想在陣列的每個成員都包含在預先確定的選項中時驗證模型。如何對序列化屬性執行包含驗證?

例如: 我有一個具有「心情」屬性的人物模型。用戶可以有不止一種情緒,但每種情緒都必須是「快樂」,「難過」,「疲倦」或「憤怒」。

的模式將是這樣的:

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

    attr_accessible :mood 
    serialize :mood 
end 

註釋的驗證不起作用。有沒有辦法讓它工作,或者我需要一個自定義驗證?

(注:我不想創建一個單獨的情緒模型)

回答

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

檢查上述文件,http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion。您不必爲此創建自定義驗證。 – Chamnap

+0

在序列化的屬性,你做,否則序列化的值檢查列入,這意味着心情= [累,生氣]將失敗,因爲MOODS.include?(心情)是假的 –

+0

啊,我沒有看到序列化的方法。你的答案應該是正確的。 – Chamnap

2

的情況下,離開這個在這裏它可以幫助任何人在未來的 - 我已經寫了一個寶石,以更好地處理驗證序列化屬性。你可以把這些驗證塊中的語法,你可能會想到辦法:

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

相關問題