序列化数组的条件验证

时间:2016-10-13 11:22:34

标签: ruby-on-rails ruby validation activerecord

如果挑战的类别为committed,我怎样才能创建habit存在必须为真的验证?

class Challenge < ActiveRecord::Base
  CATEGORY = ['goal', 'habit']
  serialize :committed, Array
  validates :committed, presence: true, if: :habit # I also tried with 'habit' & 'Habit'
end

3 个答案:

答案 0 :(得分:2)

validates :committed, presence: true, :if => lambda { |c| c.category == 'Habit' } 

答案 1 :(得分:2)

由于您的类别名为'habit'(请注意,它不是'Habit'),因此验证结果如下:

validates :committed, presence: true, if: ->(c) { c.category == 'habit' }

作为旁注:除非您的categories表中有一个名为challenges的列,否则我认为您的范围不会起作用。 因此,如果您打算选择具有类别'habit'的挑战,则范围将如下所示:

scope :habit, -> { where(category: 'habit') }

修改

根据评论中的讨论,如果您希望committed代替nil而不是[""],则无需添加自定义验证:

validate :committed_content

private

def committed_content
  self.committed = nil if committed.empty? || committed.all?(&:blank?)
  true
end

答案 2 :(得分:1)

你可以有一个方法并像这样使用它:

validates :committed, presence: true, if: :habit?

def habit?
  self.category == 'habit'
end