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的组合值。爱您的解决方案,我必须说谢谢,这真的帮了我大忙。