Rails 3: Как отобразить данные нескольких внутризависимых моделей в таблице в представлении? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть приложение для ставок, где пользователи могут делать ставки на спортивные матчи (например, баскетбол).У меня что-то вроде этого:

Group has_many   :users
Group belongs_to :league
League has_many  :matches
Match has_many   :bets
User has many    :bets

Bet belongs_to :group
Bet belongs_to :match
Bet belongs_to :user

Как видите, пользователи делают ставки в группах.Группа делает ставку на одну лигу (например, футбольный сезон 2011/2012), а лига состоит из множества матчей, на которые можно делать ставки.

Я хочу отобразить представление для действия в контроллере группы (поэтому группаэто базовая модель).Он должен отображать таблицу с совпадениями в заголовке горизонтальной таблицы и пользователями в заголовке вертикальной таблицы.В ячейке таблицы должна отображаться ставка пользователя на данный матч, например:

       | Team 1 vs Team 2 | Team 3 vs Team 4
=======+==================+=================
User 1 |       1 : 2      |       0 : 0
-------+------------------+-----------------
User 2 |       2 : 0      |       1 : 0

Теперь возникает вопрос: как лучше настроить доступ к моим данным?

Я мог бы установить атрибут @group в контроллере, а затем получить доступ к данным в представлении следующим образом:

<table>
  <thead>
    <tr>
      <th>&nbsp;</th>
      <% for match in @group.league.matches %>
        <th><%= "#{match.team1.name} vs. #{match.team2.name}" %></th>
      <% end %>
    </tr>
  </thead>
  <tbody>
    <% for user in @group.users %>
      <tr>
        <th><%= user.name %></th>
        <% for match in @group.league.matches %>
          <td><%= ?????? %></td>
        <% end %>
      </tr>
    <% end %>
  </tbody>
</table>

Моя проблема обозначена как «??????»:Как получить доступ к правильной ставке?

match.bets.find_by_group_id_and_user_id( ... ) # this will generate a new SELECT on DB
match.bets.to_a.find{|bet| bet.user_id == user.id && bet.group_id == @group.id}.home_score # seems cluttered and should not belong in the view

Ваш вклад в это очень важен.Спасибо!

1 Ответ

1 голос
/ 15 июля 2011

Это должно работать, если я правильно понимаю:

<% for user in @group.users %>
  <tr>
    <th><%= user.name %></th>
    <% for match in @group.league.matches %>
      <% bet = Bet.find_by_user_id_and_match_id(user.id, match.id) %>
      <td><%= bet.whatever.. %></td>
    <% end %>
  </tr>
<% end %>

В ответ на ваш комментарий вы можете поместить этот материал в хеш-таблицу в контроллере следующим образом:

@users = @group.users
@user_bets = @users.inject({}) do |hsh, user|
  hsh[user] = {}
  @group.league.matches.each do |match|
    hsh[user][match] = .. # look up the Bet and assign it here
  end
  hsh
end
...