在Rails 4中有类似`ILIKE`的方法吗?

时间:2015-09-24 17:49:45

标签: ruby-on-rails

我曾经在where方法中使用数组条件执行此操作:

Article.where('title ILIKE ?','%today%')

这在Postgres中有效,但MySQL和其他DBMS中不存在ILIKE

我需要的是能够使用像

这样的代码执行不区分大小写的查询
Article.ilike(title:'%today%',author:'%john%')

3 个答案:

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