Ruby on rails Rails 4中是否有类似于“ILIKE”的方法?

Ruby on rails Rails 4中是否有类似于“ILIKE”的方法?,ruby-on-rails,Ruby On Rails,我曾经在where方法中使用数组条件执行此操作: Article.where('title ILIKE ?','%today%') 这在Postgres中有效,但在MySQL和其他DBMS中没有ILIKE 我需要的是能够使用如下代码执行不区分大小写的查询 Article.ilike(title:'%today%',author:'%john%') 不,没有。您需要编写特定于驱动程序的SQL来实现这一点 ActiveRecord的目标是使90%的用例能够快速、方便地访问数据库,而不是使您的模型

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

Article.where('title ILIKE ?','%today%')
这在Postgres中有效,但在MySQL和其他DBMS中没有ILIKE

我需要的是能够使用如下代码执行不区分大小写的查询

Article.ilike(title:'%today%',author:'%john%')

不,没有。您需要编写特定于驱动程序的SQL来实现这一点

ActiveRecord的目标是使90%的用例能够快速、方便地访问数据库,而不是使您的模型完全不依赖数据库。将整个数据库后端从一个系统切换到另一个系统并不是他们优化的目标

您可以考虑查看另一个GEM,它提供了一个Ruby语法,用于包装诸如<>代码> 之类的东西(但它可能或可能不会提供等同于<代码> ILIKE ):


Rails没有直接区分大小写的搜索。这取决于DB级别。对于MySQL,您可以使用
LOWER
方法

YourModel.where('lower(column_name) = ?', str.downcase) 

即使没有内置方法来执行不区分大小写的查询,也可以使用Arel库和
匹配方法,如:

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中,并包含在你需要它的地方。

这是一个直接的等式,它根本不是
所喜欢的
ilike所做的。不过下面的部分是正确的。它可以被编辑成更低的(列名),而不是向下投票,就像?
一样。我只是necro Bump,因为这是唯一一个使用DB查询来获得结果的答案,而不是抓取所有记录并手动解析它们
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