Rails MySQL ILIKE查询

时间:2015-12-01 20:45:55

标签: mysql ruby-on-rails ruby

我的语法已关闭。我想创建一个范围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%'附近使用的语法

2 个答案:

答案 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

归功于@mu is too shortanswer