如何对序列化属性执行包含验证?

时间:2012-05-28 01:14:41

标签: ruby-on-rails validation serialization

我有一个带有序列化属性(数组)的模型。我想仅在数组的每个成员都包含在预定选项中时才验证模型。

实施例: 我有一个具有“情绪”属性的Person模型。用户可以有多种心情,但每种情绪必须是“快乐”,“悲伤”,“疲倦”或“愤怒”。

模型将是这样的:

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

  attr_accessible :mood
  serialize :mood
end

评论验证不起作用。有没有办法使它工作或我需要自定义验证?

(注意:我不想创建单独的Mood模型。)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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