【问题标题】:Case insensitive active record query in rails-4rails-4 中不区分大小写的活动记录查询
【发布时间】:2015-02-15 12:28:39
【问题描述】:

目前我正在 Rails 4 中的一个项目中工作,其中我在 example.com/username 有一个用户页面,但是如果我在正确的情况下使用用户名,它只会找到记录,我如何在活动中执行不区分大小写的搜索记录轨道。 在下面查看我的代码

@user = User.find_by_username(params[:username].downcase)

【问题讨论】:

    标签: search ruby-on-rails-4 activerecord


    【解决方案1】:

    您将不得不使用类似于where("username ILIKE ?") 的内容。 ILIKE 或类似的语法取决于您的数据库。

    【讨论】:

      【解决方案2】:

      另一种选择可能是:

      def self.search(query)
          where("lower(name) LIKE lower(?)", "%#{query}%") 
      end
      

      这适用于 sqlite 或 PostgreSQL。

      【讨论】:

      • "%#{query}%" 语法匹配任何包含查询值的字符串,这在很多情况下都可以使用。但是,如果尝试仅匹配不区分大小写的精确值,则更可取/更快:where("lower(name) = lower(?)", "#{query}").
      • 请注意,当您对这样的列值执行函数时,您可能没有使用数据库索引。可能很慢。它确实取决于您的数据库和您创建的索引的性质(例如 ORACLE 的基于函数的索引)。
      【解决方案3】:

      您可以使用 Arel 表。

      # Suppose the target username in DB is 'FooBAR'.
      t = User.arel_table
      @user = User.find_by(t[:username].matches 'foobar')
      

      这将找到用户名为“FooBar”、“foobar”、“FOOBAR”等的用户。

      更多详情请点击此处:https://github.com/rails/arel

      【讨论】:

        猜你喜欢
        • 2016-07-07
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多