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。
我的语法不对。我想创建一个范围 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。