【问题标题】:Error in using WHERE for search function in Ruby on Rails在 Ruby on Rails 中使用 WHERE 搜索功能时出错
【发布时间】: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

标签: ruby-on-rails database


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2017-09-02
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多