Ruby on rails 如何对模型中的长度验证执行if-else语句

Ruby on rails 如何对模型中的长度验证执行if-else语句,ruby-on-rails,ruby,ruby-on-rails-4,model,Ruby On Rails,Ruby,Ruby On Rails 4,Model,基本上我需要一个65000的最大长度验证,如果key_类型是4,另一个是255,如果它是任何其他的 这可能看起来很愚蠢,但在某些情况下它是必要的。我好像什么也做不到 我试过这个 validates :value, length: { maximum: 65000, if: 'key_type == 4' }, length: { maximum: 255, if: 'key_type != 4' }, uniqueness: { case_sensitive: false, scope:

基本上我需要一个65000的最大长度验证,如果key_类型是4,另一个是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'  }
但它似乎只有第二个:长度覆盖了第一个。下面发生了类似的事情,第一个最大值是: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 }
有关此方面的文档,请参阅

<>如果这太麻烦了,你可以考虑重构到自定义的验证方法/类。例如,另一种方法是将验证分为两部分:

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

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

一种方法是将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 }
有关此方面的文档,请参阅

<>如果这太麻烦了,你可以考虑重构到自定义的验证方法/类。例如,另一种方法是将验证分为两部分:

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

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

您可以逐个指定验证:

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'

您可以逐个指定验证:

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'