基本上,如果 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
我不是 Rails 方面的佼佼者,但必须有一种方法可以在模型中正常工作吗?
最佳答案
一种方法是将 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有关自定义验证方法的文档。
关于ruby-on-rails - 我怎样才能对模型中的长度验证做一个 if else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37921119/