2013-10-13 4 views
0

У меня есть запрос ActiveRecord, который вытаскивает случайно выбранный объект Matchup, где ни один из игроков в матче не находится в команде, имя текущего оппонента которой «Bye Week».Рефакторинг запроса ActiveRecord

Модель Определение:

Matchup имеет два поля, player_1 и player_2, которые являются ID объекта Player.

Каждый игрок принадлежит команде Team, которая имеет несколько полей, например. enemy_week_1, enemy_week_2 ... enemy_week_17.

current_week возвращает целое число от 1 до 17 на основе сегодняшней даты (оно определяет, на какой неделе сезона НФЛ мы находимся в настоящее время).

Прямо сейчас я делаю это так, но я хотел бы, чтобы удалить петлю, и использовать только запрос для выбора объекта, в случайном порядке, который удовлетворяет условию:

def getRandomMatchup 
    current_week = view_context.current_week 

    matchup = Matchup.order("RANDOM()").first 

    opponent1 = Team.find(Player.find(m.player_1).team.send("opp_week_#{current_week}")).name  
    opponent2 = Team.find(Player.find(m.player_2).team.send("opp_week_#{current_week}")).name 

    while opponent1 == "Bye Week" || opponent2 == "Bye Week" 
    matchup = Matchup.order("RANDOM()").first 

    opponent1 = Team.find(Player.find(matchup.player_1).team.send("opp_week_#{current_week}")).name 
    opponent2 = Team.find(Player.find(matchup.player_2).team.send("opp_week_#{current_week}")).name 
    end 

    return matchup 
end 

Моя мысль была чтобы сделать что-то вроде этого, но я не уверен, как выполнить его правильно:

m = Matchup.where.not(Team.find(Player.find(m.player_1).team.send("opp_week_#{current_week}")).name: "Bye Week", 
    Team.find(Player.find(m.player_2).team.send("opp_week_#{current_week}")).name: "Bye Week").order("RANDOM()").first 

Я использую Ruby, Rails 2 и 4.

+0

Ну, это немного сбивает с толку. Итак, внешние ключи 'player_1' и' player_2', или эти методы возвращают реальные объекты игрока? Кроме того, вы можете опубликовать определение этого метода, вызываемого через 'send'? – depa

+0

Я второй депа. Вставьте, пожалуйста, свою структуру таблицы. И приведу несколько примеров в моде: Это записи, которые у меня есть: ..... Этим я хочу быть выбранным: ...... –

+1

Yup, хотя бы пост, связанный с Team, Player и Matchup. И, пожалуйста, используйте описательные имена переменных! '' '' o1''', '' 'o2''' и' '' m''' ничего не говорят читателю. – jcm

ответ

0

Таким образом, вы должны генерировать матчапах между двумя воспроизведения в случайном порядке которые противостоят командам на текущей неделе, не «Недельная неделя»?

Как насчет

Player.joins(:teams).where.not('team.opponent_week_#{current_week}' => 'Bye Week').limit(2) 

Теперь, что не заботится о хаотичности и оставляет открытой возможность того, что оба игрока принадлежат к одной и той же команды.

Edit:

Matchup.joins(:players).where('players.id = ? OR players.id = ?', player_1, player_2).joins(:teams).where.not('team.opponent_week_#{current_week}' => 'Bye Week') 
+0

Вид. Я не создаю Matchup, они все сгенерированы и сохранены в модели Matchup. Я выбираю Matchup в случайном порядке, когда ни один из игроков в Matchup не находится в команде, у которой текущий противник - «Bye Week». Имеет ли это смысл? – jackerman09

+0

@ jackerman09 Итак, все возможные совпадения уже существуют? Вместо того, чтобы выбирать случайное совпадение и видеть, удовлетворяет ли он условиям, почему бы не обеспечить соблюдение условий в генерации Matchup? Nevermind, я знаю, почему: потому что условия (до свидания или нет) меняются каждую неделю. – jcm

+0

исправить все совпадения уже существуют, и вы совершенно правы в отношении их изменения недели за неделей. Любые мысли о том, как это сделать? Моя мысль заключалась в том, чтобы запрашивать записи, которые отвечают условию не-недельной недели, а затем упорядочивать их случайным образом и принимать первую запись, но я не уверен, как получить исходный запрос. – jackerman09

Смежные вопросы