我曾经在where
方法中使用数组条件执行此操作:
Article.where('title ILIKE ?','%today%')
这在Postgres中有效,但MySQL和其他DBMS中不存在ILIKE
。
我需要的是能够使用像
这样的代码执行不区分大小写的查询Article.ilike(title:'%today%',author:'%john%')
答案 0 :(得分:1)
即使没有内置方法来执行不区分大小写的查询,也可以使用Arel库和matches
方法,如:
Article.where(Article.arel_table[:title].matches('%today%'))
这是数据库不可知和SQL注入证明。
我在公共范围文件中编写了一个ilike
方法,允许您使用属性和值列表调用它,就是这样:
module CommonScopes
extend ActiveSupport::Concern
module ClassMethods
def ilike( options={} )
raise ArgumentError unless options.is_a? Hash or options.empty?
if options.one?
where(arel_table[options.keys.first].matches(options.values.first))
else
key, value = options.shift
ilike( {key=>value} ).merge( ilike( options ) )
end
end
end
end
您可以将其放置在app / models / concerns / common_scopes.rb中,并包含在您需要的位置。
答案 1 :(得分:0)
不,没有。您需要编写特定于驱动程序的SQL来实现此目的。
ActiveRecord的目标是让90%的用户快速轻松地访问数据库,不使您的模型完全与数据库无关。将整个数据库后端从一个系统切换到另一个系统不是他们优化的。
您可能会考虑查看另一个像DataMapper这样的gem,它提供了一个Ruby语法来包装诸如like
之类的东西(但是它可能提供或不提供等同于ilike
):< / p>
# If the value of a pair is an Array, we do an IN-clause for you.
Person.all(:name.like => 'S%', :id => [ 1, 2, 3, 4, 5 ])
答案 2 :(得分:-1)
Rails没有直接区分大小写的搜索。它取决于数据库级别。对于MySQL,您可以使用LOWER
方法。
YourModel.where('lower(column_name) = ?', str.downcase)