0

我有一个 ActiveRecord 查询,它会拉出一个随机选择的 Matchup 对象,其中比赛中的任何一名球员都不是当前对手名字为“Bye Week”的球队。

型号定义:

Matchup 有两个字段,player_1 和 player_2,它们是 Player 对象的 ID。

每个玩家都属于_to Team,它有几个字段,例如,converter_week_1、converter_week_2 ...对手_week_17。

current_week 根据今天的日期返回一个介于 1 和 17 之间的整数(它决定了我们当前处于 NFL 赛季的哪一周)。

现在我正在这样做,但我想删除循环,并只使用一个查询来随机选择一个满足条件的对象:

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 2 和 Rails 4。

4

1 回答 1

0

所以你需要在本周的对手不是'Bye Week'的两名随机球员之间生成比赛?

怎么样

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

现在,这并没有考虑随机性,并留下了两名球员属于同一支球队的可能性。

编辑:

Matchup.joins(:players).where('players.id = ? OR players.id = ?', player_1, player_2).joins(:teams).where.not('team.opponent_week_#{current_week}' => 'Bye Week')
于 2013-10-13T16:10:10.837 回答