Заявление двух операторов if в модели - PullRequest
1 голос
/ 01 марта 2012

В настоящий момент я столкнулся с проблемой, пытаясь решить, как мне написать часть модели моей игры.

В настоящее время у меня есть следующее в моем разделе индекса модели:

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 ]

2 голосов
/ 01 марта 2012

Вариант 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 голос
/ 01 марта 2012

Вы используете операторы 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 голосов
/ 01 марта 2012

Как советует KL-7, используйте if / else. Цель кейса - когда у вас несколько if. У вас есть один или два.

Если вам нужно выполнить более сложный поиск, я бы посоветовал вам использовать https://github.com/ernie/meta_search. Вам просто нужно передать параметры поиска (правильно названные ключ / значения), и он позаботится о вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...