我的情况是我的数据是一个数字,并保存为字符串。我有一个Range,我想检查字符串。 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
答案 0 :(得分: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的行为是抛出错误;这是在架构中正确键入数据的另一个好理由。