Ruby on rails ROR搜索虚拟字段
我只是将搜索添加到我的项目中,以便能够按姓名查找人员。但是在我的数据库中,我有Ruby on rails ROR搜索虚拟字段,ruby-on-rails,postgresql,search,pg,Ruby On Rails,Postgresql,Search,Pg,我只是将搜索添加到我的项目中,以便能够按姓名查找人员。但是在我的数据库中,我有名字和姓氏,但是如果有人搜索像Joe Doe这样的全名则没有匹配的结果 #model class Person < ActiveRecord::Base def full_name (self.first_name + ' ' + self.last_name).titleize end end #controller class PeoplesController < Applica
名字
和姓氏
,但是如果有人搜索像Joe Doe这样的全名则没有匹配的结果
#model
class Person < ActiveRecord::Base
def full_name
(self.first_name + ' ' + self.last_name).titleize
end
end
#controller
class PeoplesController < ApplicationController
expose(:peoples){
if params[:search]
People.where(
"first_name ILIKE ?
OR last_name ILIKE ?
", params[:search], params[:search]
)
else
People.all
end
}
end
#模型
类Person
同样,如果有人搜索名字,它会返回结果,姓氏会返回结果,但不会返回全名
如果我尝试向查询中添加full\u name
,我得到的列“full\u name”不存在
谢谢你的帮助
同样,如果有人搜索名字,它会返回结果,姓氏会返回结果,但不会返回全名
这是意料之中的,因为没有一个字段包含全名,只有部分,因此它们永远不会匹配。解决这个问题的一个简单方法是将seatch项按空格分开,然后检查是否有两个或更多项
# app/queries/people_search_query.rb
class PeopleSearchQuery
attr_reader :relation
def initialize(relation = Person.all)
@relation = relation
end
def search(params)
if params[:search]
where_str = "first_name ILIKE ? OR last_name ILIKE ?"
split = params[:search].split(" ", 2)
if split.size > 1
relation.where(where_str, *split)
else
relation.where(where_str, *(split * 2))
end
else
relation
end
end
end
class PeoplesController < ApplicationController
expose(:peoples) { PeopleSearchQuery.new.search(params) }
end
#app/querys/people\u search\u query.rb
类PeopleSearchQuery
属性读取器:关系
def初始化(关系=Person.all)
@关系
结束
def搜索(参数)
如果参数[:搜索]
where\u str=“名字是ILIKE?还是姓氏是ILIKE?”
split=params[:search].split(“,2)
如果split.size>1
关系。何处(何处?*split)
其他的
关系式。其中(式中,*(拆分*2))
结束
其他的
关系
结束
结束
结束
类PeopleController<应用程序控制器
expose(:peoples){PeopleSearchQuery.new.search(params)}
结束
虚拟字段不在数据库级别。如果不解释虚拟字段对数据库的作用,则无法执行基于数据库的搜索
字段的定义本质上是它所包含的列的列表。由于您使用的是PostgreSQL,您可以通过以下方式利用其全文搜索功能。它能够同时按多个列进行搜索
事实上,在文档中有一个例子,说明了如何做到这一点,几乎完全符合您的情况。我只是复制粘贴在这里
#模型
类Person[:first_name,:last_name]
结束
#Rails控制台的示例代码
person\u 1=person.create!(:姓氏=>“格兰特”,“姓氏=>“希尔”)
person_2=person.create!(:姓=>“休”,“姓=>“格兰特”)
Person.search_by_全名(“Grant”)#=>[Person_1,Person_2]
Person.search_by_全名(“格兰特·希尔”)#=>[Person_1]
这种事情是否值得额外依赖,取决于你。如果您发现自己正在构建许多复杂的搜索,这可能会有所帮助。您缺少的是%#{params[:search]}%”问题不在于通配符搜索,而是我还想搜索firs#u name+last_name的组合值。爱您的解决方案,我必须说谢谢,这真的帮了我大忙。