ruby-on-rails - 在 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 和其他人不会给我任何东西。
解决方案
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
如果您想以编程方式构建查询,这种方法更具可移植性并且尤其适用。
推荐阅读
- python - 每当我训练任何网络时,准确率都很差
- json - 从 blob 存储读取 HDInsight pyspark 中的 JSON
- git - 从 Windows 资源管理器将文件添加到 git 索引的最快方法
- python - 将点积应用于 3D 数组中的所有列
- sqlite - 在 React Native 中更新表时如何刷新从 SQLite 检索到的数据?
- mpdf - 上传多个文件时应用字体的 Light 版本
- nvm - 如何定位或查找 nvm(节点版本管理器)文件
- angular - 数据在 ng 多选下拉列表中不可见
- llvm - 如何使用 llvm elementwise atomic intrinsics?
- angular - 无法绑定到“formGroup”,因为它不是“form”的已知属性。角 7