2012-01-15 5 views
0

に複数の関連するオブジェクトを選択して、私は、PostgreSQLを使用していますし、私のプレイヤーモデルのようないくつかの団体があります。私はチームのラインナップをリストアップし、各プレイヤーの名前の後ろにいます私の見解では1つのクエリ

class Goal < ActiveRecord::Base 
    belongs_to :player 
end 

class Substitution < ActiveRecord::Base 
    belongs_to :player 
end 

class Penalty < ActiveRecord::Base 
    belongs_to :player 
end 

を彼らが得点したゴール、彼らが受けたペナルティ、そして彼らが代わった分(もしあれば)を表示したい。

1. Player A - goal_icon (minute) goal_icon(minute) yellow_card_icon (minute) 
2. Player B - yellow_card_icon (minute) 
3. Player C - goal_icon (minute) substituted (minute) 

だから私は明らかにしたい。同時に

  • クエリ一人のプレイヤーのためのすべての関連付け
  • ソート分フィールド上のクエリ

私はこれをどのように行うのですか?

+0

彼らは異なるエンティティであり、(例えばポリモーフィック団体として)同じインターフェイスを共有していないので、あなたが一度に「一人のプレイヤーのためのすべての関連付けを照会」することはできません。 1つは並べ替えたいいくつかの分フィールドがありますか? – clyfe

+0

私の最初の考えを確認します。だから私はこれにどのようにアプローチするのだろうか?すべてのゴール、サブ、ペナルティを収集し、分をインデックスとして並べ替える(並べ替える)方法で作成します。 - 私はそれを入力すると、私はすでにパフォーマンスのボトルネックを参照して、または私は間違っていますか? –

答えて

1

Single Table InheritanceまたはMultiple Table Inheritanceを実装してから、@player.events.sort(:minute)を呼び出すことができます。 STIと例えば

class Player < AR 
    has_many :events 
end 

class Event < AR 
    belongs_to :player 
end 

class Goal < Event end 
class Substitution < Event end 
class Penalty < Event end 

@player.events.sort(:minute) # [#Goal, #Goal, #Penalty] 
+0

私はそれを考えましたが、これらのイベントのそれぞれに追加の属性を実装するにはどうすればよいですか?たとえば、「ゴール」には「own_goal」属性が必要です。また、「ペナルティ」には、赤いカードが与えられたかどうかを判断するブール値「赤」があります。 –

+1

STIでは、すべてのクラスの属性のクロージャを持つ1つの大きな非リレーショナル化テーブルがあります。 MTIでは、各テーブルに固有の列があります。 – clyfe