首页 > 解决方案 > 在 Ruby on Rails 中使用 WHERE 搜索功能时出错

问题描述

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

我的代码:

  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 和其他人不会给我任何东西。

标签: ruby-on-railsdatabase

解决方案


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

如果您想以编程方式构建查询,这种方法更具可移植性并且尤其适用。


推荐阅读