在 Ruby on Rails 中使用 WHERE 搜索功能时出错

Posted

技术标签:

【中文标题】在 Ruby on Rails 中使用 WHERE 搜索功能时出错【英文标题】:Error in using WHERE for search function in Ruby on Rails 【发布时间】:2021-10-30 16:02:42 【问题描述】:

我做了一个控制器来搜索一些东西, 但结果很奇怪:

我的代码:

  def create
    @word = searching_params[:word]
    @searching = current_user.searchings.build(word: @word)
    flash[:notice] = "New searching is performed!" if @searching.save
    @users = User.where("firstname LIKE ? OR lastname LIKE ?", "%#@word%", "%#@word%")
    @posts = Post.where("body LIKE ?", "%#@word%")
    render :index
  end

所以,当我搜索一个名字时:Mose Collins,

o,se,ose 可以得到结果,

但是 m、c、co 和其他人不会给我任何东西。

【问题讨论】:

ILIKE替换LIKE 【参考方案1】:

LIKE 执行区分大小写的匹配。如果您想以某种多语言方式执行不区分大小写的匹配,您可以使用 LOWER() SQL 函数:

@users = User.where("LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ?", "%#@word.downcase%", "%#@word.downcase%")

Postgres 有一个不区分大小写的ILIKE 函数:

@users = User.where("firstname ILIKE ? OR lastname ILIKE ?", "%#@word.downcase%", "%#@word.downcase%")

您也可以使用 Arel 来构造它而不是 SQL 字符串:

class User < ApplicationRecord
  has_many :favorite_jobs

  def self.search(term)
    where(
      arel_table[:firstname].matches("#name").or(
        arel_table[:lastname].matches("#name")
      )
    )
  end
end

如果您想以编程方式构建查询,这种方法更便携,尤其适用。

【讨论】:

以上是关于在 Ruby on Rails 中使用 WHERE 搜索功能时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ on rails 中编写嵌套查询?

Ruby on Rails 日期查询和修改的方法--数据库常用操作

Ruby On Rails 5,activerecord query其中模型关联id包括数组中的所有id

ruby on rails sql 注入 LIKE '%#argument% 易受攻击?

Ruby on Rails - 如何在 Rails 方法中使用 HTML 坐标?

思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)