基于Rails 4

时间:2016-04-20 05:24:22

标签: ruby-on-rails

我试图在没有Join表的情况下在视图的同一个表中使用来自两个模型的数据。

我想在积分表格中显示Game_idScore。在第三列中,我想使用积分中的game_id来查找匹配相同的游戏模型的Name列中的值来自积分的ID。

在适用于此表的 ScoreboardController 中,我首先尝试选择一组Points,然后查询ID:

    @points = Point.where(user_id: current_user.id).order(game_id: :desc)
    @find = @points.pluck(:game_id).last
    @game = Game.where(id: @find)

好的,所以我将展示@points的完整列表,其中包含game_id的id整数。然后我尝试用@game查找匹配游戏。

接下来,我想在一个表格中显示这一点,第三列从@game中的行中选择.name

<tbody>
        <% @points.each do |point| %>
        <tr>
            <td><%= point.game_id %></td>
            <td><%= point.virtualmoney %></td>
            <% @game.each do |game| %>
                <td><%= game.name %>
            <% end %>
         <% end %>
        </tr>
    </tbody>

这会正确显示积分模型中所有game_ids的行,并为该游戏赢得virtualmoney。然后我尝试用game.name进行第二次迭代循环 - 它加载,但它基本上返回每一行的第一个值。

所以代替“id:1 | currency:5 | name:”游戏1“... id:2 |货币:3 |名称:”游戏2“,它只是”游戏1“,”游戏1“,依此类推。)

我该怎么做才能返回为第一列中与game_id匹配的每一行返回一个名称?

编辑:SCHEMA.RB SNIPPET

  create_table "games", force: true do |t|
    t.string   "name"
    t.integer  "max_players"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

 create_table "points", force: true do |t|
    t.integer "game_id"
    t.integer "user_id"
    t.integer "points",   default: 0
  end

2 个答案:

答案 0 :(得分:1)

如果您有正确的关联,以下内容将满足您的需求:

<tbody>
    <% @points.each do |point| %>
      <tr>
        <td><%= point.game_id %></td>
        <td><%= point.virtualmoney %></td>
        <td><%= point.game.name %></td> 
      </tr>
    <% end %>
</tbody>

事情是,游戏has_many点,点belongs_to游戏。因此,您可以通过此point.game.name从点对象获取关联的游戏名称。虽然这违反了德米特定律,但它会做你需要的。

答案 1 :(得分:0)

我并不完全明白你想要做什么,但希望以下几点可以提供帮助。如果我理解正确,以下几行无效:

<% @game.each do |game| %>
  <td><%= game.name %>
<% end %>

,因为...

@find = @points.pluck(:game_id).last
##Will return only one Game id (e.g. 1)

@game = Game.where(id: @find)
## Will return a ActiveRecord Collection with only one game.

在这种情况下,您可能最好使用:

@game = Game.find(@find)

这相当于调用:

@game = Game.where(id: @find).first

因此,当遍历@game时,您只需遍历仅包含1个项目的ActiveRecord Collection。

包括您添加的基本关联将有助于更好地理解。