2011-01-08 3 views
0

다음과 같은 쿼리가 제공됩니다.레일즈 - 조건부 쿼리, ActiveRecord 포함?

current_user.conversations.where("params[:projectid] = ?", projectid).limit(10).find(:all) 

params [: projectid]가 jQuery ajax에서 전송됩니다. 때로는 정수이고 위의 경우에는 문제가 없습니다. 하지만 "모든 프로젝트"를 선택하면 레일즈가 0으로 바뀌어 잘못된 쿼리가 발생합니다.

정의 된 경우 검색 매개 변수 [: projectid] =?를 어떻게 사용합니까?

감사

답변

5

질문을 잘못 입력했다고 생각합니다. "params[:projectid] = ?"은 어떠한 상황에서도 유효한 쿼리 조건이 아니어야합니다.

@conversations = current_user.conversations.limit(10) 
@converstaions.where("project_id = ?", params[:project_id]) unless params[:project_id].blank? 

Sidenotes :

  1. 아마 이런 식으로 뭔가를 선호하는 것, 비록

    if params[:project_id].blank? 
        @conversations = current_user.conversations.limit(10) 
    else 
        @conversations = current_user.conversations.where("project_id = ?", params[:project_id]).limit(10) 
    end 
    

    : 어떤 경우에

    , 당신은 조건문 일종의을 할 수 .find(:all)을 사용할 필요가 없습니다. 결과 세트가 필요할 때 (예 : @conversations.each) Rails는 자동으로 쿼리를 실행합니다.
  2. 가능하면 레일스의 snakecasing 명명 스키마 (예 : 이 아니라 project_id)를 고수하십시오. 장기적으로 당신과 공동 작업자는 많은 두통을 덜어 줄 것입니다.

감사합니다.하지만 where 쿼리에서 3 개의 매개 변수, project_id, project_status 등이 있다고 가정하면 아이디어가 작동하지 않습니다. 나는 레일스가 조건부 쿼리 매개 변수를 처리하는 더 좋은 방법이 없다는 것에 충격을 받았다.

편집 : 쿼리의 일부가 될 수있는 여러 매개 변수가있는 경우 where이 해시를 인수로 사용한다고 생각해보십시오. 이를 통해 매개 변수 해시를 쉽게 동적으로 구축하고 where에 전달할 수 있습니다. 아마 이런 식으로 뭔가 : 위의 경우

conditions = [:project_id, :project_status, :something_else].inject({}) do |hsh, field| 
    hsh[field] = params[field] unless params[field].blank? 
    hsh 
end 

@conversations = current_user.conversations.where(conditions).limit(10) 

, 당신은 배열의 모든 분야에 걸쳐 루프를 거라고, 그것은 빈의하지 않는 결과 해시 에 각 하나를 추가 할 수 있습니다. 그런 다음 해시를 where 함수에 전달하면 모든 것이 잘되고 멋장이가됩니다.

+0

감사합니다.하지만 where 쿼리에서 3 params, project_id, project_status 등을 말할 수있는 경우가 아니면 아이디어가 작동하지 않습니다. 나는 레일스가 조건부 쿼리 매개 변수를 처리하는 더 좋은 방법이 없다는 것에 충격을 받았다. – AnApprentice

+0

@AnApprentice : 어떻게 처리 할 수 ​​있는지에 대한 편집 된 답변보기. – vonconrad

+0

마지막 옵션은 매력처럼 작동 ... 우리는 루비의 마법을 부를 수 있을까요? 이것은 훌륭하고 기능적입니다! – scaryguy

-1

당신이 넣어 이유 :

where("params[:projectid] = ?", projectid) 

당신이 PARAMS받을 경우 [: 프로젝트] 아약스 요청에서를, 쿼리 문자열은 안 :

where("projectid = ?", params[:projectid]) 

intead?

그리고 당신은 당신이 항상 테스트 할 수있는 매개 변수로 빈 문자열 ('')을 수신하는 경우 :

unless params[:projectid].blank? 

내가 질문을 undestood 생각하지 않는다,하지만 난이 도움이되기를 바랍니다.