Ruby on rails Rails 3:如何在视图中的表中显示多个内部相关模型的数据?

Ruby on rails Rails 3:如何在视图中的表中显示多个内部相关模型的数据?,ruby-on-rails,model-view-controller,view,associations,Ruby On Rails,Model View Controller,View,Associations,我有一个投注应用程序,用户可以在体育比赛(如篮球)上下注。我有这样的想法: 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 如您所见,用户分组下注。一个团体在一个联赛上下注

我有一个投注应用程序,用户可以在体育比赛(如篮球)上下注。我有这样的想法:

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
现在的问题是:如何最好地设置对我的数据的访问?

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
我可以在控制器中设置@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>

非常感谢您在这方面的意见。谢谢

如果我理解正确,这应该是可行的:

<% 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 %>

嗨,吉米,谢谢你的回复。是的,这是可行的(如果我为组添加另一个动态条件),但是对模型的访问不会封装在控制器中。有没有另一种解决方案与MVC模式相对应,或者对于目前的情况来说这是可以接受的?是的,我同意这远远不是最佳的。我看到的唯一其他方法是构建一个哈希,看起来像:{:user=>{:match=>:bet},{:match=>:bet}…}谢谢你的更新,吉米。虽然我希望rails能够提供一个更简单的解决方案,但我认为注入(或者每个_都使用_对象)对我来说是可行的+1并接受:)再次感谢。
@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