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

Active Admin循环异常:如何将运动会员数据转为键值对哈希

修复Active Admin Row哈希构建问题

让我来帮你拆解下问题所在,然后一步步修复:

核心问题分析

你的代码有两个关键问题导致结果不符合预期:

  1. 没有返回目标哈希:你的row块最后没有返回构建好的level变量,Active Admin默认会返回块内最后一行代码的执行结果——也就是user.try(:sport_memberships).each的返回值,也就是整个sport_memberships集合,这就是你看到那个对象数组的原因。
  2. Sport名称查询错误:Sport.where(id: sport.try(:sport_id)).try(:name)是错误的写法,where返回的是ActiveRecord集合而非单个对象,直接调用name会返回nil;而且你完全可以利用模型的belongs_to关联直接获取Sport名称,不用手动通过ID查询。

修复后的代码方案

我们可以优化代码逻辑,同时解决潜在的N+1查询问题(避免循环里反复访问数据库):

row :skill_level do |user|
  # 提前预加载sport关联,避免循环中多次查询数据库
  sport_memberships = user.sport_memberships.includes(:sport)
  # 用each_with_object直接构建目标哈希,写法更简洁安全
  sport_memberships.each_with_object({}) do |membership, level_hash|
    # 利用关联直接获取sport名称并转为符号
    sport_name = membership.sport.name.to_sym
    level_hash[sport_name] = membership.level
  end
end

额外优化说明

  • 预加载关联:使用includes(:sport)提前把所有关联的Sport数据一次性查询出来,避免循环内每次都发起数据库请求,提升页面加载性能。
  • 容错处理:如果担心membership.sport可能为nil,可以加上安全调用,比如membership.sport.try(:name)&.to_sym,这样即使Sport不存在也不会触发报错。
  • 简化哈希构建:each_with_object比手动初始化哈希再调用merge!的写法更直观,也不容易出现哈希覆盖或遗忘返回的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:38