我试图在没有Join表的情况下在视图的同一个表中使用来自两个模型的数据。
我想在积分表格中显示Game_id
和Score
。在第三列中,我想使用积分中的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
答案 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。
包括您添加的基本关联将有助于更好地理解。