【问题标题】:Case insensitive search using IN operator in Ruby on Rails and PostgreSQL在 Ruby on Rails 和 PostgreSQL 中使用 IN 运算符进行不区分大小写的搜索
【发布时间】:2016-09-17 20:01:12
【问题描述】:

我是 ROR 新手,正在尝试使用 Active Record 在 PostgreSQL 数据库中实现搜索。我发现要使搜索不区分大小写,我可以使用ILIKE 运算符而不是equalsLIKE,但不知道当我需要使用IN 运算符时该怎么做。

我得到了一个字段名称和一组值,我需要检查它们,区分大小写的搜索是这样的:

records = records.where(filter['fieldName'] => filter['value'])

其中filter['value'] 是一个数组。

有没有办法更新该行以使其不区分大小写?

如果不是,那么我相信唯一的方法是遍历该数组并将IN 拆分为许多OR 操作,并对该数组中的每个值使用ILIKE(但是我不确定如何使用或使用 Active Record)?

谢谢!

【问题讨论】:

  • “过滤器”哈希来自哪里。看起来 SQLI 对我来说很容易。您可以将已经小写的值存储在数据库中吗?你能添加额外的索引吗?
  • @pascalbetz 过滤器是我通过 REST 从另一个应用程序发送的自定义结构的一部分。不幸的是,我需要在数据库中保留真实案例,但我几乎通过以下建议修复了它。

标签: ruby-on-rails ruby postgresql rails-activerecord


【解决方案1】:
records.where("lower(#{filter['fieldName']}) in (?)", filter['value'].map(&:downcase))

【讨论】:

  • 看起来你的答案是最接近的 :) records = records.where('"' + filter['fieldName'] + '"' +" ILIKE ANY ( array[?] )", filter['value'].map {|value| "%#{value}%" }) 这对我有用。谢谢!
  • @OlesMalkov 您应该将其发布为答案并接受它。
【解决方案2】:

这对我有用:

records = records.where('"' + filter['fieldName'] + '"' +
                         " ILIKE ANY ( array[?] )", filter['value'].map {|value| "%#{value}%" })

【讨论】:

  • 顺便说一句,假设value 可能包含%,您也应该转义特殊符号。
【解决方案3】:

试试这个......

records.where("lower(#{filter['fieldName']}) in ?", filter['value'].map(&:downcase))

希望这对你有用。

【讨论】:

  • @pascalbetz,不确定这应该如何工作,因为他使用的是= 而不是in
  • @OlesMalkov 你是对的。应该是“IN”而不是“=”。或者他可以使用此处描述的“类似”stackoverflow.com/questions/4928054/…
猜你喜欢
  • 2013-02-26
  • 2011-10-17
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2012-12-20
  • 2010-09-12
相关资源
最近更新 更多