ruby-on-rails - 我怎样才能对模型中的长度验证做一个 if else 语句

标签 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

我不是 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/

相关文章:

ruby-on-rails - 我的 Rails 应用程序和 Postgres DB 在生产中需要多少内存?

ruby-on-rails - Rails - 如何在不使用 Accepts_nested_attributes_for 的情况下管理嵌套属性?

ruby-on-rails - 测试套件多长时间太长?

ruby-on-rails - 从 Controller 访问模型方法

ruby-on-rails - 如何在 Rack 级别阻止请求?

ruby-on-rails - 验证 Rails 4 中的电话号码格式 - REGEX

ruby-on-rails - 从 Controller 渲染 js 时使用 Rails Sprockets 指令

ruby-on-rails - 绕过seeds.rb中的attr_accessible

ruby-on-rails - ruby-2.2.4 缺少库

ruby - 为什么 6.times.map 在 ruby​​ 1.8.7 而不是 1.8.6 中工作