基本上,如果key_type
为4
,我需要一个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
我不是最好的导轨,但必须有一种方法可以在模型中进行这项工作吗?
答案 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'