You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails调用RoundRobinTournament.schedule报String无delete_at方法错误

问题根因

RoundRobinTournament.schedule 方法要求传入的参数是包含所有参赛选手的数组,你第一段可正常运行的代码中,%w(John Paul Ringo George) 就是符合要求的字符串数组。
你第二段报错的代码中,将单个选手的姓名字符串 player.first_name 直接传入了方法,字符串没有数组的 delete_at 方法,因此触发报错。

修复方案

你逻辑上的错误是把「生成所有选手赛程」的方法放到了单个选手的遍历循环里,正确的写法应该是先把所有选手的姓名收集为数组,再调用赛程生成方法:

<%# 先收集所有参赛选手的姓名为数组 %>
<% students = @players.map(&:first_name) %>
<%# 生成赛程 %>
<% teams = RoundRobinTournament.schedule(students) %>
<%# 遍历渲染赛程即可,示例按天渲染对阵 %>
<% teams.each do |daily_matches| %>
  <tr>
    <% daily_matches.each do |match| %>
      <td><%= "#{match[0]} VS #{match[1]}" %></td>
    <% end %>
  </tr>
<% end %>
额外注意事项
  • 该方法内部使用了delete_at、rotate!等原地修改数组的方法,如果你后续还需要使用原始的选手姓名数组,传入参数时调用dup传副本即可,避免原数组被篡改:
    <% teams = RoundRobinTournament.schedule(students.dup) %>
    
  • 循环赛至少需要2名参赛选手才可生成有效赛程,建议调用方法前先判断students的长度,避免极端场景下的异常。

内容的提问来源于stack exchange,提问作者Otto Heij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:02