2012-10-17 3 views
1

사용자가 데이터베이스에서 프로젝트를 입력, 편집 및 검색 할 수있는 앱이 있습니다.Ruby on Rails : 부울 검색 - postgres

내 검색 기능에서 검색에 매개 변수를 추가하여 복잡한 검색을 수행 할 수 있습니다.

def self.like(text); "%#{text}%"; end 

    def self.search(search_archive, search_client, search_status, search_fullname) 
    # start with a scoped query, to apply more scopes on it afterwards 
    _projects = Project.scoped 
    # then, for each of the parameters, apply the scope only if present 

    if search_archive.present? 
     _projects = _projects.where ['archive LIKE ?', like(search_archive)] 
    end 
    if search_client.present? 
     _projects = _projects.where ['client LIKE ?', like(search_client)] 
    end 

    if search_status.present? 
     _projects = _projects.where ['status LIKE ?', like(search_status)] 
    end 

if search_fullname.present? 
     _projects = _projects.where ['fullname LIKE ?', like(search_fullname)] 
    end 
    # now you have applied only the present scopes. return the result, and watch 
    # the query as it executes. 

    _projects 

    end 

최근에는 프로젝트를 보관 처리하는 옵션이 추가되었습니다.이 옵션은 프로젝트 테이블에 부울로 저장됩니다.

나는 내가 시도한 방식대로 부울을 처리 할 수 ​​있다고 생각하지 않기 때문에 내 검색 기능이 잘못되었다는 것을 알고있다.

PG::Error: ERROR: operator does not exist: boolean ~~ unknown 
LINE 1: SELECT COUNT(*) FROM "projects" WHERE (archive LIKE '%{"{:c... 

어떤 아이디어 : 여기

오류인가? 미리 감사드립니다.

UPDATE :

: 여기
PG::Error: ERROR: missing FROM-clause entry for table "archive" 
LINE 1: SELECT COUNT(*) FROM "projects" WHERE "archive"."{:class=>"... 
              ^
: SELECT COUNT(*) FROM "projects" WHERE "archive"."{:class=>""archive""}" = '1' 

내 검색 작업입니다 :

아래의 제안에 변경

if search_archive.present? 
    _projects = _projects.where(:archive => search_archive) 
end 

나는이 오류 검색 VIEW의

추가 PART

<%= form_tag search_path, method: :get do %> 

<% if current_user.try(:admin?) %> 
Archive: 
<%= check_box :archive, :class => "archive" %></H2> 
<% end %> 
<% if !current_user.try(:admin?) %> 
<%= hidden_field :archive, :value => false %> 
<% end %> 

<div class="client"> 
Client : 
<%= select(@projects, :client, Project.order("client").map{|p| [p.client]}.uniq, :prompt => "-Any-", :selected => params[:client]) %></br> 
</div> 

<div class="buttons"> 
<div id="search_button"> 
<%= submit_tag "Search", name: nil, :class => "button" %> 
</div> 

<% end %> 

설명 * 내가 관리를 오전, 내가 선택하지 않은 아카이브 확인란을두면, 내가하지 않은 모든 프로젝트를보고 싶어

보관되었습니다. 내가 확인하면, 내가 검색 한 다른 매개 변수와 함께 포함 된 보관 된 파일 만보고 싶을뿐입니다.

일반 사용자의 경우 보관함 확인란을 볼 수 없어야하며 모든 검색은 문서 보관실에 허위 사실이있는 프로젝트에 있어야합니다.archive 부울이며, 당신이 진정한 나에 대한 거짓을 검색하려면, 그리고 search_archive도 부울 경우

답변

2

난 아직도 오류가 발생, 부울이

<% if current_user.try(:admin?) %> 
    Archive: <%= check_box_tag :archive, true, false, :class => "archive" %></H2> 
<% else %> 
    <%= hidden_field :archive, :value => false %> 
<% end %> 
+0

내 검색보기를 추가했습니다. 사용자가 admin인지 여부에 따라 true 또는 false를 검색해야합니다. – Jazz

+0

@jazz : - 업데이트 된 답변 확인 – Salil

+0

고맙습니다. 그러나 상자가 티켓이 아니라면 항상'archive'를 거짓으로 검색하기 위해 모든 검색이 필요합니다. 그래서 관리자 만이 아카이브 된 파일을 볼 수있는 이유는 없기 때문에 아무 검색도 보이지 않을 것입니다. 왜냐하면 모든 검색은 항상'archive'를 거짓으로 검색하기 때문입니다. – Jazz

2

, 이것은 당신이해야 할 모든 것입니다 :

if search_archive.present? 
    _projects = _projects.where(:archive => search_archive) 
end 

UPDATE :

귀하의 체크 박스 구문이 잘못 될 필요가 뭔가 같은 :경우

check_box("project", "archive", {:class => 'archive'})

+0

if search_archive.present? _projects = _projects.where(:archive => search_archive != "false") end 

변경에게 안녕을

<% if current_user.try(:admin?) %> Archive: <%= check_box :archive, :class => "archive" %></H2> <% end %> <% if !current_user.try(:admin?) %> <%= hidden_field :archive, :value => false %> <% end %> 

를 follwing을 같은 것을 추가 할 수 있습니다. 내 질문을 오류 및 검색 작업으로 업데이트했습니다. 감사합니다 – Jazz

+0

search_archive 변수로 전달할 내용을 확인하십시오. 부울이 아닙니다. –

+0

사실, 그것은 '1'을 통과 한 것 같습니다. 하지만 그건 포스트 그레스에서 괜찮은 것 같아? – Jazz