我在搜索PG时遇到问题。我有一个表有两列第一名和姓。我希望有人能够使用他们的名字,姓氏或全名来搜索一个人。 我正在关注全球搜索PG的Railscast#343,据我所知,搜索应该可行,因为我打算工作,但它没有。下面的代码只会在您输入确切的名字或姓氏时返回结果;它不会返回任何内容,如果您输入名字和姓氏,或者您只是放置名字或姓氏的一部分。
如果我打算如何使这项工作,我将不胜感激。
模型
def self.text_search(query)
if query.present?
where("first_name @@ :q or last_name @@ :q", q: query)
else
where(nil)
end
end
控制器
def index
@members = @organization.members.text_search(params[:query]).page(params[:page]).per(20)
end
控制台输出
SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "members" WHERE "members"."organization_id" = $1 AND (first_name @@ 'jon' or last_name @@ 'jon') AND (expiration_date <= '2014-11-30') AND (expiration_date > '2014-10-31') LIMIT 20 OFFSET 0)
答案 0 :(得分:1)
关于什么可能有助于您获得所需内容的几点想法。
首先,在您的查询中,我相信您应该使用ILIKE来使搜索字符串不敏感,并且%%包围您的搜索字词,以便postgres知道进行部分匹配。这是我使用的自动完成jquery文本框中的示例。 Link to the PG Documentation
def users
search_term = params[:term]
@users = current_account.users.where("name ILIKE ?", "%#{search_term}%").order(name: :asc)
respond_to do |format|
format.json { @users }
end
end
我要做的第二个建议是使用Ransack,以便您可以使用相同的搜索框一次搜索多个字段。例如,如果您使用的是Ransack,则可以执行以下操作:Link to Ransack on Github
<%= search_form_for @q do |f| %>
<%= f.label :first_name_or_last_name %>
<%= f.search_field :first_name_or_last_name %>
<%= f.submit %>
<% end %>
然后您的控制器就像:
一样简单def index
@q = Member.search(params[:q])
@members = @q.result(distinct: true)
end
要搜索全名以及第一个和最后一个,我认为您必须在模型中创建一个名为full_name的字段,然后您可以轻松地将其添加到搜索中。我不确定如果没有实际存在于模型中,你还能做到这一点。
希望有所帮助!