10

has_many through複数のソースとの関係を作成しようとしています。

たとえば、ゲームにはhome_teamandaway_teamがあり、トーナメントには複数のゲームがあります。

has_many スルー ゲーム リレーションを使用して、すべてのチームをトーナメントに参加させる最善の方法は何ですか。

現在、私のコードは次のようになっています。

class Tournament
  has_many :teams, :through => :games, :source => :home_team, :uniq => true
end

しかし、私はそれを次のように動作させる方法が欲しい:

class Tournament
  has_many :teams, :through => :games, :source => [:home_team, :away_team], :uniq => true
end

編集:多対多の関係は私の問題ではありません。次のような構造を想定して、すべてのチームをトーナメントに参加させる良い方法はありますか。

class Game
  has_and_belongs_to_many :tournaments
  belongs_to :home_team, :class_name => Team, :foreign_key => :home_team_id
  belongs_to :away_team, :class_name => Team, :foreign_key => :away_team_id
end

class Tournament
  has_and_belongs_to_many :games
end

方法はありますTournament.teamsか?

4

2 に答える 2

4

組み込みのソリューションを探すのに時間を費やした後、teams in games というカスタム クエリを作成することになりました。team_1 と team_2 を介してチームをゲームに 2 回参加させ、ゲーム ID のリストのいずれかがこれら 2 つの参加のいずれかに含まれているかどうかを確認します。

このソリューションは複数のクエリを必要とするため (そのうちの 1 つは、すべてのゲーム ID の膨大なリストにすぎません)、優れた方法ではありませんが、別の方法を考え出すのに多くの時間を費やしましたが、できませんでした。少なくともこの方法は機能します。

もっと良い方法を学びたいです。

ゲーム内のコード:

def self.teams
  joined_tables = Team.joins(:home_team).joins(:away_team)
  joined_tables.where('games.id in (?) or  away_team_games.id in  (?)',
                   select(:id), select(:id)).uniq
end
于 2013-03-19T01:27:12.840 に答える
-3

次のようにモデルを定義します。

class Tournament
  has_many :games
  has_many :teams, :through => :games
end

class Game
  belongs_to :torunament
  belongs_to :team
end

class Team
  has_many :games
  has_many :tournaments, :through => :games
end

そして、コントローラー、またはどこでも呼び出します:

tournament.teams

編集:

scopeモデルでこの種の問題を定義できますTournament。これはカスタム クエリに似ており、そのままレールでサポートされています。少なくとも今この瞬間は思い出せない。

それらの使用方法を見ることができます。

http://guides.rubyonrails.org/active_record_querying.html http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope http://ablogaboutcode.com/2011/02/19/scopes-in-rails- 3/

すべてのチームを取得するクエリを作成できます。任意のクエリを作成できます。

于 2013-03-08T13:06:53.537 に答える