2012-03-01 13 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'。 – 2012-03-01 11:34:23

+0

嘿,我剛剛更新了我的問題,以瞭解我所嘗試的以及我正在嘗試做的事情。 – user1222136 2012-03-01 11:49:15

+0

如果你只能描述遊戲和用戶之間的關係,那麼我會在2秒內爲你繪製它。 – TomDunning 2012-03-01 12:09:45

回答

2

選項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 2012-03-01 17:22:55

0

就像KL-7建議的那樣,使用if/else。案件的目的是當你有多個if的時候。你有一兩個。

如果你需要做更復雜的搜索,我建議你使用https://github.com/ernie/meta_search。你只需要傳入搜索參數(正確命名鍵/值),它會照顧你。

1

您正在使用true或false條件case語句,這使得難以閱讀的代碼,你可以做這樣的事情:

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 

那的條件。但是,我從你的代碼猜,你的模型是這樣的:

用戶:

has_many :games 

遊戲:

belongs_to :user 

所以,你可以這樣來做:

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 2012-03-01 17:23:37