【问题标题】:rails - Case Insensitive Search Conditionrails - 不区分大小写的搜索条件
【发布时间】:2011-01-22 23:02:54
【问题描述】:

我有以下几点:

  @users = User.find( :all,
                      :select => 'users.*',
                      :conditions => ["fname || ' ' || lname LIKE ?", '%'+"#{params[:q]}"+'%']

这里的问题是搜索输入 params[:q] 区分大小写。如何在我的 Rails 3 Heroku 应用程序中使其不区分大小写?

谢谢

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-3 heroku


    【解决方案1】:

    要让 PostgreSQL 不区分大小写,只需使用 ILIKE。它根据活动区域设置工作。

    【讨论】:

    • 是否需要任何特殊的索引才能使其顺利运行?有什么索引吗?
    • @AnApprentice:它可以正常工作,但 ILIKE 不是可索引运算符。如果您需要索引访问,请参阅有关使用 upper() 和常规 LIKE 的 polarblaus 建议,可以将其设为可索引。
    • 我想没有办法索引以 % 开头的 LIKE 语句(匹配任何内容)。语句的第一部分是可变的 - 需要单独的基于表达式的索引。要查找您的架构如何执行带有 EXPLAIN 前缀的执行查询。
    【解决方案2】:

    这个问题的一个相当“常见”的解决方法似乎是使用UPPER 函数将您的情况下的“fname”或“lname”转换为大写,并使用例如转换params[:q]upcase.

    【讨论】:

      【解决方案3】:

      或者...将其粘贴到您的模型中并通过传入字符串数组来调用

      def self.find_all_by_lowercasing_name(str_array)
          wrapped = str_array.collect { |a| "'"+ "#{a.downcase}" + "'" }
          return MyModel.where("lower(\"my_models\".\"name\") IN (#{wrapped.join(', ')})")
      end
      

      以上适用于 Postgres 和 Sqlite

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-18
        • 2011-01-14
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 2012-06-06
        • 2013-09-26
        • 2023-03-20
        相关资源
        最近更新 更多