2012-02-08 50 views
0

我是一个尝试构建我的第一个rails应用程序的noob。这是一个“博彩游戏”,用户试图预测足球结果并获得正确结果的积分或正确的“趋势”(胜利,平局,宽松)。Rails:在一个视图中从三个相关模型中收集数据

创建和更新投注工作正常,同时创建游戏并以管理员用户身份插入结果。但我有在显示来自所有用户的所有投注每场比赛中的一种索引页,它应该大致是这样的问题:

     | User1 | User2 | User3 ... 
Game   Result | Bet | Bet | Bet 
Team1 : Team2 1:0 | 1:1 | 3:2 | 1:0 
Team3 : Team4 1:2 | 1:2 | -:- | 3:0 
Team5 : Team6 -:- | 1:2 | -:- | 3:0 
... 

我的模型结构如下:

class User < ActiveRecord::Base 
has_many :bets 

class Game < ActiveRecord::Base 
has_many :bets 

class Bet < ActiveRecord::Base 
belongs_to :user, :class_name => 'User', :foreign_key => 'user_id' 
belongs_to :game, :class_name => 'Game', :foreign_key => 'game_id' 

在上述场景中表示 - : - 并非每个用户都会在每场比赛中下注,并且不是每场比赛都会有结果。

我尝试了数千种方法来获取索引视图的数据,并得到了多个错误(无对象,没有方法等)的问题。目前(不工作)的方式在控制器中得到的一切:

def index 
    @users = User.all 
    @games = Game.all 
    @bets = Bet.all 
end 

,并在试图重复的游戏,并通过在视图中的用户和赌注每场比赛中的观点,同时检查是否赌注用户和游戏存在,从而导致无法读取乱码有:

<% @games.each do |game| %> 
    <tr> 
     <td><%= game.home_team %> - <%= game.away_team %></td> 
     <td> 
      <% if game.away_score.nil? %> 
       -:- 
      <% else %> 
       <%= game.home_score %> : <%= game.away_score %> 
      <% end -%> 
     </td> 
     <% @users.each do |user| %> 
      <% bet = Bet.where(:user_id => user.id, :game_id => game.id) %> 
      <% if bet.exists? %> 
       <td><%= bet.home_bet %> : <%= bet.away_bet %></td>    
      <% else %> 
       <td>-:-</td> 
      <% end -%> 
     <% end -%> 
    </tr> 
<% end -%> 

我希望你能提出来完成这个一个更清洁的方式。不幸的是,我读过的几十篇文章都没有解决我的问题。

所以,第一个问题是:从不同的表中检索所需数据的最佳方法是什么?相应的第二个问题:在控制器中构建数据并将其传递给视图还是将它们放在视图中最好?

我正在使用rails 3.1.1和squlite3。 我希望有人能够帮助这个愚蠢的newbee ...

这里
+0

您可以发布一些您尝试在控制器中组装数据的操作吗?除非你的用户集合会非常小,否则你的用户水平走势不会很好。所有的用户都会在所有游戏上下注吗?如果他们有,那么你可以创建一个表格,将每一行分配给一个游戏,并通过你的投注进行迭代并将它们放入单元格中... – 2012-02-08 14:36:57

+0

刚刚编辑:不,并非所有用户都会在每场比赛中下注,似乎造成了主要问题。由于用户将在稍后的社区(约10名成员)中进行组织,我希望横向布局适合,但那不是当前的主要问题。我稍后会发布一些示例,因为我现在没有全部代码。谢谢回答! – marc78 2012-02-08 14:39:44

+0

大家知道,你的情况下不需要'class_name'和'foreign_key'选项。它们是从关联名称('belongs_to:game')自动推断出来的,只有当关联名称与模型名称或键名称不同时,才需要它们。 – 2012-02-08 14:43:52

回答

0

我可能会做是这样的:

控制器:

@users = User.all 
@game_bets = Game.all.map { |game| [game, game.bets.index_by(&:user)] } 

观点:

<% @game_bets.each do |game, bets| %> 
    ... 
    <% @users.each do |user| %> 
    <% if bets.has_key?(user) %> 
     <td><%= bets[user].home_bet %></td> 
    <% else %> 
     <td>-:-</td> 
... 
+0

谢谢你,维克多,那工作! – marc78 2012-02-08 18:20:50

+0

如果有很多用户,这可能会很慢。遍历所有用户不应该是必要的。 – 2012-02-09 16:04:58

+0

@MarkThomas OP旨在在一个屏幕上显示所有用户/游戏,因此速度显然不是问题。 – 2012-02-09 17:33:56

1

这么多的问题...让我们开始

  1. 没有必要通过所有用户对每场比赛进行迭代。您可以通过game.bets和每个“赌”由bet.user获取用户迭代,根据你已经建立

  2. 要回答你的第一个问题的关系:因为你是试图使“报告”样的看法与意图展示'所有'游戏,您的方法有@games = Game.all是正确的。你不需要其他2个.all集合,因为你可以推断出关系中的数据

  3. 第二个问题:在Rails中,它被认为是一个很好的方法来使用'fat models,skinny controllers'这意味着你的数据处理/逻辑代码应该在模型中,控制器应该只有对应视图使用的代码。

  4. 关于您的观点:在你的情况,因为你有一个人烟稀少的表,你应该使用if S代表情况下,您的看法是不是非常差到哪得分不适等

+0

感谢您的建议,这对我们有很大的帮助!也许我的看法并不那么凌乱... :-) – marc78 2012-02-08 18:24:09

相关问题