我正在尝试在Ruby on Rails中使用递归关联,但我没有得到预期的输出:)我希望与两个玩家(赢家和输家)匹配,我想到了递归关联。
我使用脚手架来完成基本操作:
rails g scaffold Player firstname:string lastname:string
rails g scaffold Match date:date result:integer winner:references loser:references
然后修改匹配模型:
class Match < ActiveRecord::Base
has_one :winner, class_name: 'Player', foreign_key: 'id'
has_one :loser, class_name: 'Player', foreign_key: 'id'
end
但是如果我手动添加一些玩家并去匹配#index,则赢家和输家都是相同的(即使我将它们设置为不同)。
部分观点是这样的:
<tbody>
<% @matches.each do |match| %>
<tr>
<td><%= match.date %></td>
<td><%= match.result %></td>
<td><%= match.winner %></td>
<td><%= match.loser %></td>
<td><%= link_to 'Show', match %></td>
<td><%= link_to 'Edit', edit_match_path(match) %></td>
<td><%= link_to 'Destroy', match, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
当我编辑Match时,我清楚地看到有不同的玩家ID,但在show或index中,两个玩家都是相同的。
我做错了什么?
谢谢:)
答案 0 :(得分:1)
您正在使用&#34; has_one&#34;关联,实际上是在另一个类/表(这里是播放器)上设置数据库链接。这不是你想要的:你想在匹配表上有两个外键(winner_id和loser_id)。
这可以使用更常见的&#34; belongs_to&#34;关联:
class Match < ActiveRecord::Base
belongs_to :winner, class_name: "Player"
belongs_to :loser, class_name: "Player"
end