0

我有一种情况,我的数据是一个数字,并保存为一个字符串。我有一个要检查字符串的范围。Range 中的项目是一个整数。我怎样才能做到这一点?以下是我正在编写的范围的代码:

if value == "above"
  scope.where(["level > ?", level_range.last])
elsif value == "below"
  scope.where(["level < ?", level_range.first])
elsif value == "at"
  scope.where(:level => level_range)
else
  scope
end
4

1 回答 1

2

您说level数字存储为字符串。首先,这有点愚蠢。如果可以,请修复您的架构以存储为数字。如果您无法更改架构,并且您的数据库符合 ANSI,则可以使用CAST()存储的值与您的范围参数执行整数比较。

if value == "above"
  scope.where(["CAST(level AS INTEGER) > ?", level_range.last])
elsif value == "below"
  scope.where(["CAST(level AS INTEGER) < ?", level_range.first])
elsif value == "at"
  scope.where(["CAST(level AS INTEGER) BETWEEN ? AND ?",
              level_range.first, level_range.last])
else
  scope
end

一个警告是,如果字符串不是有效的整数表示,CAST 的行为是抛出错误;这是在架构中正确键入数据的另一个好理由。

于 2013-08-09T20:23:34.413 回答