Ruby on rails Rails:在一个视图中从三个相关模型收集数据

Ruby on rails Rails:在一个视图中从三个相关模型收集数据,ruby-on-rails,ruby,sqlite,rails-activerecord,Ruby On Rails,Ruby,Sqlite,Rails Activerecord,我是一个试图构建我的第一个rails应用程序的noob。这是一个“博彩游戏”,用户尝试预测足球结果,并获得正确结果或正确“趋势”(赢、平、松)的分数 创建和更新赌注工作正常,还可以作为管理员用户创建游戏和插入结果。但我在索引页面中显示每个游戏的所有用户的所有赌注时遇到了问题,大致如下所示: | User1 | User2 | User3 ... Game Result | Bet | Bet | Bet

我是一个试图构建我的第一个rails应用程序的noob。这是一个“博彩游戏”,用户尝试预测足球结果,并获得正确结果或正确“趋势”(赢、平、松)的分数

创建和更新赌注工作正常,还可以作为管理员用户创建游戏和插入结果。但我在索引页面中显示每个游戏的所有用户的所有赌注时遇到了问题,大致如下所示:

                       |  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'
我的模型结构如下所示:

                       |  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'
在视图中,尝试通过视图中的用户和下注迭代到游戏和每个游戏中,同时检查是否存在用户和游戏的下注,这会导致无法读取的混乱代码:

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

- 
-:-
: 
user.id,:game_id=>game.id)%>
:               
-:-
我希望你能提出一个更干净的方法来实现这一点。不幸的是,我读的几十篇帖子都不能解决我的问题

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

我将rails 3.1.1与squlite3一起使用。
我希望,有人能帮助这个愚蠢的新手…

这里有这么多问题。。。让我们开始吧

  • 没有必要对每个游戏的所有用户进行迭代。您可以通过
    game.bets
    进行迭代,并根据您建立的关系,通过
    bet.user
    为每个“下注”获得一个用户

  • 回答您的第一个问题:由于您试图制作一个“报告”视图,以显示“所有”游戏,因此您使用
    @games=Game.all
    的方法是正确的。您不需要另外两个
    。所有的
    集合,因为您可以从关系中推断数据

  • 第二个问题:在Rails中,拥有“胖模型,瘦控制器”被认为是一种好方法,这意味着数据处理/逻辑代码应该在模型中,控制器应该只有相应视图使用的代码

  • 关于您的视图:在您的情况下,您的视图并不糟糕,因为您有一个稀疏填充的表,对于分数不可用的情况,您应该使用
    if
    s等


  • 我可能会这样做:

                           |  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
    
    @users = User.all
    @game_bets = Game.all.map { |game| [game, game.bets.index_by(&:user)] }
    
    视图:

    
    ...
    -:-
    ...
    
    您能否发布一些您尝试在控制器中组装数据的方法?除非您的用户集合非常小,否则让您的用户水平跟踪不会很好地扩展。您的所有用户都会在所有游戏上下注吗?如果他们有,那么你可以创建一个表,将每一行分配给一个游戏,然后迭代你的赌注并将它们放入单元格中…只是编辑:不,不是所有用户都会在每个游戏上下注,这似乎是主要问题的根源。由于用户稍后将组织在社区中(大约有10名成员),我希望横向布局合适,但这不是目前的主要问题。我将在稍后发布一些示例,因为我现在没有所有的代码。谢谢你的回答!正如您所知,在您的案例中不需要使用
    class\u name
    foreign\u key
    选项。它们是根据关联的名称自动推断出来的(
    属于:game
    ),并且仅当关联名称与模型名称或键名称不同时才需要。@Andrew:我知道,这是阅读了大量关于rails关系和尝试不同事物的结果。但是谢谢你指出这一点!我现在没有时间发布完整的答案,但我建议一个
    有很多:通过
    关系,就像在
    游戏中有很多用户:通过=>:bets
    一样。然后,您可以通过
    游戏获得一切。all
    (并通过调用返回正确内容的模型或助手来替换if语句来清理您的视图)感谢您的建议,这非常有帮助!也许我的观点没有那么混乱…:-)如果有很多用户,这可能会非常慢。不需要遍历所有用户。@MarkThomas OP打算在一个屏幕上显示所有用户/游戏,所以速度显然不是问题。@VictorMoroz不太可能。他希望显示与每个游戏相关的所有用户。如果在任何特定时刻都有与游戏无关的用户,并且这个数字可能会变得很大,那么这就是一个问题。