递归关联在索引/显示/编辑操作中的行为方式不同

时间:2015-03-29 17:50:29

标签: ruby-on-rails ruby

我正在尝试在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中,两个玩家都是相同的。

我做错了什么?

谢谢:)

1 个答案:

答案 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