如何在模型中对长度验证执行if else语句

时间:2016-06-20 11:15:15

标签: ruby-on-rails ruby ruby-on-rails-4 model

基本上,如果key_type4,我需要一个65000的最大长度验证,如果是其他的话,我需要另外255个。

拥有它可能看起来很愚蠢,但它在某种情况下是必需的。我似乎无法开始工作。

我试过这个

  validates :value, length: { maximum: 65000, if: 'key_type == 4' }, length: { maximum: 255, if: 'key_type != 4' }, uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key], if: 'key_type == 2'  }

但它似乎只有第二个:length覆盖第一个。下面发生类似的事情,第一个maximum: 65000被完全忽略

  validates :value, length: { maximum: 65000, if: 'key_type == 4', maximum: 255, if: 'key_type != 4' }, uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key], if: 'key_type == 2'  }

这也不起作用

if :key_type == 4
 validates :value, length: { maximum: 65000 }, uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key], if: 'key_type == 2'  }
else
  validates :value, length: { maximum: 255 }, uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key], if: 'key_type == 2'  }
end

我不是最好的导轨,但必须有一种方法可以在模型中进行这项工作吗?

2 个答案:

答案 0 :(得分:4)

一种方法是将Proc对象条件传递给验证方法,例如:

validates :value,
  length: { maximum: 65000 },
  uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key] },
  if: ->{ key_type == 4 }

validates :value,
  length: { maximum: 255 },
  uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key] },
  if: ->{ key_type != 4 }

有关此文档,请参阅here

如果这变得太麻烦,您可以考虑重构为自定义验证方法/类。例如,另一种方法是将验证分为两部分:

validates :value,
  uniqueness: {  case_sensitive: false, scope: [:category_item_id, :key] }

validate :value_length

def value_length
  if key_type == 4
    errors.add(:value, 'is too long') if value.length > 65000
  else
    errors.add(:value, 'is too long') if value.length > 255
  end
end

有关自定义验证方法的文档,请参阅here

答案 1 :(得分:0)

您可以一个接一个地指定验证:

validates :value, uniqueness: { case_sensitive: false, scope: [:category_item_id, :key] }, if: 'key_type == 2'
validates :value, length: { maximum: 65000 }, if: 'key_type == 4'
validates :value, length: { maximum: 255 }, unless: 'key_type == 4'