2012-05-28 22 views
5

私は直列化された属性(配列)を持つモデルを持っています。配列の各メンバーがあらかじめ決められたオプションに含まれている場合にのみモデルを検証したいと思います。シリアル化された属性のインクルード検証を実行するにはどうすればよいですか?

例: 「気分」属性を持つPersonモデルがあります。ユーザーは複数の気分を持つことができますが、それぞれの気分は「幸せ」、「悲しい」、「疲れている」、「怒っている」のいずれかでなければなりません。

モデルはこのようなものになるだろう:コメント検証が動作しません

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?(mood)がfalseであるためmood = [tired、angry]は失敗します。 –

+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

関連する問題