ruby-on-rails - 如何在 Ruby 中使用 LIKE 进行搜索
问题描述
我在 keykill 表中有两条记录,名称为“SAP FICO”和“FICO SAP”。当我用“FICO SAP”搜索记录时。我想同时获得这两个记录。如果我搜索,有什么方法可以获取此记录?
如果我搜索,我想要这两个结果,我尝试使用如下所示,但它只获取一个。
search = "FICO SAP"
KeySkill.where("name LIKE ?", "%#{search}%")
这是我的 Keyskill 表数据(在表中这样创建)
<KeySkill id: 50, name: "SAP FICO", relevant_experience: "1", created_at: "2019-01-06 08:48:54", updated_at: "2019-01-06 08:48:54", deleted_at: nil>
<KeySkill id: 51, name: "FICO SAP", relevant_experience: "1", created_at: "2019-01-06 08:48:55", updated_at: "2019-01-06 08:48:55", deleted_at: nil>
解决方案
处理此问题的一种简单方法是
search_term = "FICO SAP"
terms = search_term.split
filtered_skills = KeySkill
terms.each do |t|
filtered_skills = filtered_skills.where("name like '%#{term}%'")
end
然后只需使用filtered_skills
来检索它们。
这适用于原始搜索词的每个部分必须以随机顺序出现的情况。所以我们可以只使用and
所有术语。
[编辑:如果你想搜索不区分大小写]
如果您希望此搜索不区分大小写,where
如果您使用的是 postgresql,则可以重写如下
.where("name ilike '%#{term}%'")
(ilike = 不区分大小写的 LIKE)。但是这种方法只适用于 postgresql,所以对于任何其他数据库,您可以使用以下内容:
.where("lower(name) like '%#{term.downcase}%'")
推荐阅读
- c++ - 无法在 Windows 上编译 boost::asio 示例
- c - 广度优先搜索问题
- sql - 如果使用 SQL 的内部连接找到 null,如何将默认值传递给选定的列名
- c# - 在一个 XML 文件中保存并加载两次 DataTable 并加载它
- spring-boot - 即使使用 Etag、max-age: 0、must-revalidate 和 no-cache,更改后的静态文件的 URL 仍然返回 304
- c - 为什么这个 printf 语句需要一个 & 符号?
- php - Symfony 3 - 如果帐户在 FOSUserBundle 中被禁用,则继续会话
- r - 带有 dplyr 的条件过滤器
- javascript - 从 Google 地球引擎中的其他脚本调用函数
- java - 如何在android中用颜色填充区域?