Rails MySQL ILIKE 查询

Rails MySQL ILIKE query

我的语法不对。我想创建一个范围 by_name 来查找名称属性包含传入字符串(不区分大小写)的所有 agencies

这是我的:

class Agency < ActiveRecord::Base
  scope :by_name, ->(agency_name) { where('name ILIKE ?', "%#{agency_name}%") }
end

在 rails 控制台中,我输入 agencies = Agency.by_name("foo")。这是生成的查询:

SELECT `agencies`.* FROM `agencies`  WHERE (name ILIKE '%foo%')

错误信息如下:

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ILIKE '%foo%')

我觉得应该是:

 scope :by_name, lambda { |agency_name| 
   where('name LIKE ?', "%#{agency_name}%") # not ILIKE
 }

It is in PostgreSQL 可以使用关键字 ILIKE 代替 LIKE,根据活动区域设置使匹配不区分大小写。这不在 SQL 标准中,而是一个 PostgreSQL 扩展。

在MySQL你没有ILIKE。签出 MySQL docs on string comparison functions.


奖金 - 您也可以使用 Arel。看看:

scope :by_name, lambda { |agency_name| 
  where(Agency.arel_table[:name].matches("%#{agency_name}%"))
}

为什么是,因为 there's no such thing as ILIKE in MySQL。只有 LIKE。您可能已经将 ILIKE 视为 PostgreSQL 中 LIKE 的不区分大小写的版本,但您当前的 RDBMS 是不同的。

你最好的选择是在两边使用 LOWER 来达到基本相同的效果:

.where('LOWER(name) LIKE LOWER(?)', "%#{agency_name}%")

归功于 @mu is too short for his answer