0

結果を追加・編集するフォームがあれば表示したい。n * n のテーブルがあります。ここで、セル内のチームの数は結果によって与えられます。これはどのように最適ですか?

view/championship/show.erb
<table class="table table-bordered">
  <tr><th>&nbsp;</th>
    <% @teams.each do |teamhome| %>
    <th class="vertical"><%= teamhome.name %></th>
    <% end %>    
  </tr>
  <% @teams.each do |teamguest| %>
  <tr>
    <th><%= teamguest.name %></th>
    <% @teams.each do |teamhome| %>
      <%if teamhome == teamguest %>
        <td bgcolor = '#F9F9F9'>
      <% else %>
        <td> 

         #render form               


        </td>
      <% end %>
    <% end %>
  </tr>
  <% end %>
</table>

モデル

class Score < ActiveRecord::Base
  attr_accessible :team1_score, :team2_score, :team1_id, :team2_id, :team1, :team2

  belongs_to :team1, class_name: 'Team', foreign_key: :team1_id
  belongs_to :team2, class_name: 'Team', foreign_key: :team2_id

  def self.to_arr

    score_arr = self.find(:all, :select => 'team1_id, team2_id, team1_score, team2_score').to_a

  end


end


class Team < ActiveRecord::Base
  attr_accessible :name

  belongs_to :championship
  has_many :team1_scores, class_name: 'Score', foreign_key: :team1_id
  has_many :team2_scores, class_name: 'Score', foreign_key: :team2_id

  validates :name, presence: true, length: { maximum: 100 }
  validates :championship_id, presence: true


end

スキーマ

"team1_id"|"team2_id"|"team1_score"|"team2_score"

4

1 に答える 1

0

1 つの方法は、すべてのスコアを次の形式のハッシュとしてロードすること{ [:team1_id, :team2_id] => [:team1_score, :team2_score] }です。

@scores = Score.all.inject({}) do |m, s| 
  m[[s.team1_id, s.team2_id]] = [s.team1_score, s.team2_score]
  m
end

これで、次のように各ホーム/ゲストのペアリングのスコアをレンダリングできます。

<% scores = @scores[[teamhome.id, teamguest.id]] %>
<%= "#{scores.first} / #{scores.last}" if scores %>

このアプローチの利点は、ハッシュ キーによって一致するスコアを見つけることができることです。これは、大量のデータの場合でもかなり迅速に行う必要があります。欠点は、このハッシュがすべてのスコアに対してロードされること@championshipです。この問題を回避したい場合は、スコアを関連するチームに絞り込む範囲を構築できます。Score.your_scope次に、の代わりに呼び出すだけですScore.all

別のアプローチ (ハッシュを作成する必要がない) は、ホーム チームから直接スコアを取得し、そのゲスト チーム セルに適切な一致を検出することです。

<% scores = teamhome.team1_scores.detect{|s| s.team2_id == teamgues.id }
<%= "#{scores.team1_score} / #{scores.team2_score}" if scores %>

大量のデータがない場合は、この単純な方法で十分です。最初にチームをロードするときにホーム チームのスコアを熱心にロードするようにしてください。そうしないと、N+1 クエリでパフォーマンスが低下します。

アップデート

これらの両方のアプローチで、スコアは としてレンダリングされまし"home_team_score / guest_team_score"たが、一致するスコアが見つかった場合のみです。見つからない場合、何もレンダリングされません - これはif scores条件文によるものです。他のものをレンダリングしたい場合は、条件を変更して三項演算子を使用できます。以下の例は、スコアを収集するための 2 番目のアプローチに従います。

<%= scores ? "#{scores.team1_score} / #{scores.team2_score}" : "No Score" %>

'No Score'これは、一致するスコアのセットが見つからない場合にレンダリングされます。

于 2013-04-15T21:43:21.293 に答える