2012-03-01 69 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