在模型中声明两个if语句

时间:2012-03-01 10:55:29

标签: ruby-on-rails model

我试图解决如何编写我的游戏模型的一部分时遇到的问题。

我目前在模型的def索引部分中有以下内容:

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呢?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您正在使用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

答案 2 :(得分:0)

像KL-7建议一样,使用if / else。案例的目的是当你有多个if时。你有一两个。

如果您需要进行更复杂的搜索,我建议您使用https://github.com/ernie/meta_search。你只需要传入搜索参数(正确命名的键/值),它会照顾你。