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