2012-03-01 7 views
1

저는 현재 게임 모델의 섹션을 작성하는 방법을 해결하려고 할 때 문제가 발생했습니다.모델에 두 개의 if 문을 표시합니다.

저는 현재 모델의 내 데프 인덱스 부분에 다음과 같습니다

def index 
    games_relation = case params[:console].present? 
    when true then Game.where(:console => params[:console]) 
    else Game 
    end 
    @games = games_relation.search(params[:search]) 
end 

이제 잘 작동하지만 다음이 포함 그래서 나는 이름에서 보이는 다른 섹션에 추가 할 :

user_relation = case params[:username].present? 
    when true then User.where("username LIKE ?", "#{params[:username]}%") 
    else User 
end 

이제 인덱스에 두 개의 루프를 넣을 수 있다고 상상하지만 어떻게 @games 행을 수행할까요?

나는 다음하지만 운이 뭔가를 시도 :

def index 
    games_relation = case params[:console].present? 
    when true then Game.where(:console => params[:console]) 
    else Game 
    end 

    name_relation = case params[:game_name].present? 
    when true then Game.where("game_name LIKE ?", "#{params[:game_name]}%") 
    else Game 
    end 

    @games = name_relation.games_relation.search(params[:search]) 
end 

나는 현재는 games_relation를 호출하지만 games_relation과 user_relation를 호출 할 수 있도록 내가 어떻게 할 것이가?

+1

죄송합니다, 나는 당신의 문제를 이해하지 못했지만, 한 가지 내가 확실히 말할 수있다 : 당신은 두 가지 옵션이 경우 case 문을 사용하지 말아야합니다 . 대신에'if ... else'를 사용하십시오. –

+0

안녕하세요 저는 방금 시도한 내용과 시도하려는 내용을 알려주기 위해 제 질문을 업데이트했습니다. – user1222136

+0

게임과 사용자 간의 관계를 설명 할 수 있다면 2 초 안에이 내용을 그려 보겠습니다. – TomDunning

답변

2
:

belongs_to :user 

그래서 당신은 이런 식으로 할 수

옵션 1) 최소 코드 방법 :

@games = Game 
@games = @games.where("game_name LIKE ?", "#{params[:game_name]}%") if params[:game_name].present? 
@games = @games.where("console = ?", params[:console]) if params[:console].present? 

그러나 3 개의 쿼리가 발생합니다.

옵션 2) (1) 쿼리, 더 많은 코드 :

@games = if params[:game_name].present? && params[:console].present? 
    Game.where("console = ? AND game_name LIKE ?", params[:console], "#{params[:game_name]}%") 
elsif params[:game_name].present? && !params[:console].present? 
    Game.where("game_name LIKE ?", "#{params[:game_name]}%") 
elsif !params[:game_name].present? && params[:console].present? 
    Game.where("console = ?", params[:console]) 
else 
    Game 
end 
+0

그래, 내 질문에 대답했다. 건배 그 :) – user1222136

0

KL-7 권고 사항과 마찬가지로 if/else를 사용하십시오. 사건의 목적은 여러 개의 if가있는 경우입니다. 당신은 하나 또는 둘 있습니다.

복합어 검색을 수행해야하는 경우 https://github.com/ernie/meta_search을 사용하는 것이 좋습니다. 검색 매개 변수 (적절하게 명명 된 키/값)를 전달하기 만하면 처리가됩니다. 조건에 대한

games_relation = params[:console].present? ? Game.where(:console => params[:console]) : Game 

그리고

user_relation = params[:game_name].present? ? User.where("game_name LIKE ?", "#{params[:game_name]}%") : User 

그게 전부 :

1
당신은 코드를 읽기 어려워 질 true 또는 false 조건의 경우 문을 사용하는

, 당신이 뭔가를 할 수 있습니다. 그러나 나는 당신의 모델이 같은 것을 사용자 코드에서 추측 :

사용자 :

has_many :games 

게임 :

def index 
    @games = User.games 

    @games = @games.where(:console => params[:console]) if params[:console].present? 

    @games = @games.where("game_name LIKE ?", "#{params[:game_name]}%") if params[:game_name].present? 

    @games 
end 
+0

이 또한 내 질문에 대한 답변입니다.도와 줘서 고마워. :) – user1222136

관련 문제