【问题标题】:Ruby on Rails - how to make .where method case insensitiveRuby on Rails - 如何使 .where 方法不区分大小写
【发布时间】:2014-01-02 20:17:52
【问题描述】:

我有这个方法,效果很好:

def find
  return User.where(:name=> params[:search])
end

我的问题是它区分大小写,所以如果我搜索"bob",它不会返回任何名称大写的用户(例如"Bob")。有没有办法让它不区分大小写?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

你也可以使用

User.where('name ILIKE ?', params[:search])

【讨论】:

  • 我认为这是最好的解决方案!但是,它只适用于 PostgreSQL
【解决方案2】:

应该这样做:

def find
  User.where("lower(name) = ?", params[:search].downcase)
end

通过使 db 条目小写和搜索参数小写,那么不区分大小写不再是问题。

此外,Ruby 中不需要 return 语句,因为我们有隐式返回语句。

它是如何工作的?

您可以将原始 SQL 传递给 .where 命令。 lower() 是 SQL 中的函数,而不是 Ruby,它将单个字符串参数作为小写字符串返回。它相当于 Ruby 中的 .downcase。现在原始字符串和要比较的字符串都是小写的,大小写不再重要。

【讨论】:

  • 如果你的表很大,这个方法非常慢。它对表中的所有行运行 lower 方法。
  • @MichaelKoper 如果您有一个 text/varchar 列并且知道您需要对其执行快速不区分大小写的搜索,您可以(并且应该!)在函数结果上创建一个索引。这是 PostgreSQL 的示例: CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
【解决方案3】:

类似这样的:

def find
    return User.where(:name=> params[:search].downcase)
end

【讨论】:

  • 如果db中的值是大写的怎么办?
  • User.where(:name.downcase => params[:search].downcase)
  • @jigz。不,那不行。它只会小写符号 ":name",而不是 DB 中的值。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多