0

現在の対戦相手の名前が「Bye Week」であるチームにどちらのプレイヤーも所属していない、ランダムに選択された Matchup オブジェクトを取得する ActiveRecord クエリがあります。

モデル定義:

Matchup には、Player オブジェクトの ID である player_1 と player_2 の 2 つのフィールドがあります。

各プレイヤーはチームに所属します。このチームには、相手の週_1、相手の週_2 ... 相手の週_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

では、今週の対戦チームが「さようなら」ではない 2 人のランダムなプレイヤー間の対戦を生成する必要がありますか?

どうですか

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 に答える