我的语法已关闭。我想创建一个范围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 ::错误:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册 在'ILIKE'%foo%'附近使用的语法
答案 0 :(得分:16)
我认为应该是:
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}%"))
}
答案 1 :(得分:7)
为什么是,因为there's no such thing as ILIKE
in MySQL。只有1个}}。您可能已经在PostgreSQL中看到LIKE
作为ILIKE
的不区分大小写的版本,但您当前的RDBMS是不同的。
你最好的选择是双方使用LIKE
来达到大致相同的效果:
LOWER