【问题标题】:Not case sensitive search with active record不区分大小写的搜索与活动记录
【发布时间】:2011-06-30 10:31:08
【问题描述】:

我使用 Rails 3.0.4

这是我的 rails 应用程序中的一段 Arel 查询,如何使用 upcase 方法以与数据库无关的方式进行不区分大小写的搜索?

Customer.where("company_id = ? and (firstname like ? or lastname like ? or reference like ?)", current_user.company_id, "%#{params[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%")

谢谢

【问题讨论】:

  • 请记住,当您运行像 StefanS 提到的那个查询时,整个表将被加载和扫描,因为数据库引擎必须处理每一行以转换为小写然后比较,所以它可能是一个昂贵的查询。

标签: ruby-on-rails activerecord arel


【解决方案1】:

这里有几个选项供您选择。

首先,LIKE 已经不区分大小写,但对于 Postgres,您必须使用 ILIKE 使您的搜索不区分大小写。

Customer.where('firstname LIKE ?', "%john%").first.name
=> 'John'

其次,如果您想使用不区分大小写的比较与非模式匹配比较(如 、=、

Customer.where('firstname COLLATE utf8_unicode_ci = ?', 'john').first.name
=> 'John'

Postgres 似乎还没有COLLATE 命令,但您可以查看更多关于不区分大小写的搜索选项here。通常,当您想要执行模式匹配或复杂查询时,您将无法以与数据库无关的方式执行此操作。我的建议是在开发和生产中都使用单一的数据库系统。这可确保您的查询在两种环境中的行为方式也相同,从而减少错误。如果您确实需要支持多个数据库系统,那么您最好的选择是简单地创建两个不同的查询 - 例如,一个在 MySQL 上运行,一个在 Postgres 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2013-09-26
    • 2023-03-20
    • 1970-01-01
    • 2011-01-02
    • 2013-02-17
    相关资源
    最近更新 更多