【问题标题】:Postgres case insensitive searching with Rails使用 Rails 进行 Postgres 不区分大小写的搜索
【发布时间】:2011-10-17 01:09:41
【问题描述】:

我的开发数据库是 SQLite,但我将我的应用程序部署到 Heroku 并且他们使用的是 PostgreSQL。

现在,如果我执行搜索,有时会出现两个不同的结果,因为 PostgreSQL 区分大小写但 SQLite 不区分。

Rails 不应该将这些东西标准化吗?我应该用什么方法来解决这个问题?

Here is how to fix it with raw SQL

【问题讨论】:

  • 如果您要部署到 Heroku,我建议您在 PostgreSQL 之上进行开发。没有 ORM 可以保护您免受特定于数据库的行为的影响。
  • 而且我喜欢在本地使用 SQLite 并在发货时使用 Postgre,所以我不依赖于某个数据库。各有各的。

标签: ruby-on-rails postgresql case-insensitive sql-like


【解决方案1】:

Postgres 中不区分大小写的搜索:

  • 使用ilike 而不是like(不区分大小写)
  • 如果要使用 =,请将两边设为 UPPER 或 LOWER

【讨论】:

  • 谢谢! like 的问题是我不知道如何使用 OR 运算符链接它们。将它与每个支持的 db by rails 一起使用是否可以节省? "LOWER(title) LIKE LOWER('%#{search_term}%')"
  • 它不会破坏我在 mysql、sqlite 和 pgsql 中的代码,所以它足够好,谢谢!
  • 如果您想在 MYSQL 和 POSTGRES 上运行相同的代码,请使用 UPPER 或 LOWER(尽管这显然不是最佳实践!)
【解决方案2】:

DDL 的另一种处理方式是 citext 数据类型或不区分大小写的 TEXT。

【讨论】:

    【解决方案3】:

    ActiveRecord 没有处理很多比较常见的事情,LIKE 匹配就是其中之一。以下是使用直接 Arel 来实现此目的的方法。

    Model.where(
      Model.arel_table[:title].matches("%#{search_term}%")
    )
    

    您可以安装Arel-Helpers 以简化此操作

    Model.where(Model[:title].matches("%#{search_term}%"))
    

    我之前为此推荐过Squeel,但原作者已停止支持,似乎也没有专职开发人员维护它。而且由于它使用私有的 ActiveRecord API,因此需要不断的维护。

    【讨论】:

    • 很棒的解决方案,Squeel 也很棒,但请注意这是 Postgres 特有的行为。如果您希望为其他 RDBMS 执行此操作,则输出可能区分大小写。
    • @kgx 实际上这个例子在这两种情况下都可以正常工作。正如@antpaw 上面所说,SQLite LIKE 默认情况下不区分大小写。所以这将在 SQLite 中使用 LIKE,在 PostgreSQL 中使用 ILIKE
    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多