如何在Ruby on Rails梦幻足球应用中实现用户顺序选秀功能
顺序选秀功能补充实现清单
1. 新增核心数据模型
首先需要补充选秀相关的底层数据结构,用于存储选秀规则、顺序、状态:
- 新建
Draft(选秀大会)模型,迁移文件示例:
class CreateDrafts < ActiveRecord::Migration[7.0] def change create_table :drafts do |t| t.string :name, null: false t.integer :status, default: 0 # 枚举值:0=待开始 1=进行中 2=已结束 t.integer :total_rounds, default: 15 # 总选秀轮次,可根据需求调整 t.integer :current_round, default: 1 t.integer :pick_timeout, default: 120 # 单轮选人超时时间,单位秒 t.references :current_user, foreign_key: { to_table: :users } # 当前顺位用户 t.timestamps end end end
- 新建
DraftOrder(选秀顺序)模型,用于绑定选秀和用户的顺位关系,迁移文件示例:
class CreateDraftOrders < ActiveRecord::Migration[7.0] def change create_table :draft_orders do |t| t.references :draft, null: false, foreign_key: true t.references :user, null: false, foreign_key: true t.integer :position, null: false # 顺位序号,从1开始 t.boolean :picked_current_round, default: false # 当前轮次是否已选人 t.timestamps end end end
- 给现有模型补充关联和字段:
LineItem新增draft_pick_id字段,可选,用于追溯球员的选秀来源Squad新增球员数量验证,和选秀总轮次对应,防止超员
2. 核心业务逻辑补充
2.1 权限与状态校验
在LineItemsController的create动作最前面新增前置校验:
- 校验当前选秀状态必须为进行中,否则拦截请求返回错误
- 校验当前登录用户必须是选秀的
current_user,非当前顺位用户无权提交选人请求 - 校验当前用户的squad球员数量未达到总选秀轮次上限
2.2 顺位流转逻辑
用户选人成功、超时、弃权后,自动触发顺位流转:
- 标记当前用户
DraftOrder的picked_current_round为true - 查询当前轮次是否所有用户都已完成选人:
- 是:轮次+1,所有用户的
picked_current_round重置为false,顺位回到第1位 - 否:顺位+1,找到下一位顺位的用户
- 是:轮次+1,所有用户的
- 更新
Draft模型的current_round和current_user字段,进入下一个选人周期
2.3 超时处理逻辑
可配合定时任务(Sidekiq/Clockwork)实现超时检测:当前顺位用户超过设定时间未操作的,自动弃权或随机分配1名未被选中的球员,自动触发顺位流转。
3. 路由与控制器补充
- 新增
drafts、draft_orders资源路由,额外新增start_draft、skip_pick、abstain等业务路由 - 新增
DraftsController实现选秀的创建、启动、状态查询、顺位流转等核心接口 - 新增弃权动作:支持用户主动放弃当前轮次选人,触发顺位流转
4. 前端交互补充
- 球员列表页新增选中状态:已被其他用户选中的球员置灰,隐藏选择按钮
- 页面顶部新增选秀状态提示区:显示当前轮次、当前顺位用户、剩余选人倒计时
- 当前顺位用户的页面高亮操作提示,非顺位用户隐藏选人按钮
- 推荐接入
Action Cable实现实时推送:用户选完人后所有在线页面自动刷新选秀状态、球员列表,无需手动刷新
5. 边缘场景兼容
- 选秀全部结束后自动锁定所有squad的球员列表,禁止新增/删除LineItem
- 支持选秀开始前管理员调整顺位顺序,选秀开始后禁止修改
- 新增选秀记录页,所有用户可查看每一轮次的选人明细
内容的提问来源于stack exchange,提问作者Funk Dr
相关产品推荐
相关产品推荐

