0

PG 검색에 문제가 있습니다. 이름과 성이 두 개의 열이있는 표가 있습니다. 나는 누군가가 그들의 이름, 성 또는 성을 사용하여 한 사람을 찾을 수 있기를 바랍니다. PG에 대한 전체 텍스트 검색에서 Railscast # 343을 수행 중이었고 이해할 수있는 부분에 대해서는 검색이 작동하도록되어 있지만 작동하지는 않습니다. 아래 코드는 정확한 성이나 이름을 넣을 때만 결과를 반환합니다. 이름과 성을 입력했거나 성이나 이름의 일부만 입력하면 아무 것도 반환하지 않습니다.전체 텍스트 검색이 레일에서 완전히 작동하지 않습니다. 4 PG 9.3

내가 의도 한대로이 작업을 수행하는 방법에 대한 의견을 보내 주시면 감사하겠습니다.

모델

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) 

답변

1

당신이 찾고있는 무엇을 얻을 도움이 될 무엇에 그냥 몇 가지 아이디어.

첫 번째 질문에 ILIKE를 사용하여 검색 대/소문자를 구분하지 않아야하며 또한 %%는 검색 용어를 둘러 쌈으로써 부분 일치를 수행 할 수 있음을 알 수 있습니다. 다음은 내가 사용하는 자동 완성 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 

두 번째 제안은 동일한 검색 상자로 한 번에 여러 필드를 검색 할 수 있도록 더듬다을 사용하는 것입니다. 당신이 더듬다를 사용한다면 예를 들어, 같은 일을 할 수있는 다음 : 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이라는 필드에 모델을 만들어야한다고 생각하고 쉽게 검색에 추가 할 수 있습니다. 모델에 실제로 있지 않으면 어떻게 할 수 있을지 모르겠습니다.

희망 하시겠습니까?

+1

도움을 주셔서 감사합니다! 나는 PG를 사용하는 동안 "%"를 사용할 수 없다는 인상 아래에있었습니다. 내가 할 수있는 사실을 말하면, 지금까지이 문장을 만들었습니다'where ("first_name ILIKE? OR last_name ILIKE? OR first_name || ''| last_name ILIKE?", "% # {query} %", " % # {query} % ","% # {query} % ")' – DJF