我试图解决如何编写我的游戏模型的一部分时遇到的问题。
我目前在模型的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呢?
答案 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。你只需要传入搜索参数(正确命名的键/值),它会照顾你。