首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串的ActiveRecord验证,但能够将字符串的一部分视为整数

字符串的ActiveRecord验证,但能够将字符串的一部分视为整数
EN

Stack Overflow用户
提问于 2021-09-19 04:32:10
回答 2查看 218关注 0票数 0

我正在使用Ruby3.0.2,并试图使用ActiveRecord进行验证。

我希望验证用户输入,即字符串,但希望将输入的部分视为数字,这样我就可以对其应用一些逻辑。

输入需要如下所示

21-10

我将使用regex来确保这两个数字之间存在“-”,但我希望能够验证这些数字,以确保:

  • 这两组数字之一是21。
  • 这两个数字不能大于21,除非它们之间的差别是彼此相隔的。

我面临的挑战是能够将字符串的部分处理为具有验证的数字。

输入的一个示例,它将是有效/无效的:

代码语言:javascript
复制
11-21 // valid
10-23 // invalid because 23 > 21
11-11 // invalid because neither numbers are 21
22-24 // valid because 22 & 24 within 2 of each other

任何帮助都很感激!

EN

回答 2

Stack Overflow用户

发布于 2021-09-19 07:14:00

这可以用这样的自定义验证方法来完成:

代码语言:javascript
复制
# in the model
validate :range_string_has_validate_pattern

private

def range_string_has validate_pattern
  parts = range_string.split('-') # assuming the attribute is named `range_string`
  
  if parts.size != 2
    errors.add(:range_string, "does not contain two parts separated by a '-'")
    return
  end

  begin 
    parts[0] = Integer(parts[0])
    parts[1] = Integer(parts[1])
  rescue
    errors.add(:range_string, "does not contain two numbers")
    return
  end

  return if parts[0] == 21 || parts[1] == 21
  return if (parts[0] - parts[1]).abs == 2

  errors.add(:range_string, "does not match requirements")
end
票数 0
EN

Stack Overflow用户

发布于 2021-09-20 09:24:36

我会选择模式匹配(是现代红宝石)和自定义验证器方法。

代码语言:javascript
复制
validates :your_attribute, format: { with: /\A\d+-\d+\z/ }
validate :string_format

def string_format
  # do not attempt if the format is wrong
  return if errors.where(:your_attribute).present?

  case your_attribute.split('-').map(&:to_i)
  in [..20, ..20] 
    error.add(:your_attribute, 'Both numbers are less than 21')
  in [..20, 22..] | [22.., ..20]
    error.add(:your_attribute, 'One is less the other is more')
  in [22.. => x, 22.. => y] if y - x > 2 or x - y > 2
    error.add(:your_attribute, 'Difference is too big')
  else
    return
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69240297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档