在 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 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 快速入門)