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

Active Admin展示自定义Scope时触发NoMemoryError内存分配失败

解决Rails 4.2.6中Active Admin使用自定义Scope出现NoMemoryError的问题

嘿,我来帮你搞定这个内存溢出的问题!咱们一步步排查问题所在:

1. 自定义Scope的语法错误

你在User模型里定义的active_customers Scope有明显问题:

scope :active_customers, -> { patient.where.not(customer_id: nil) }

这里的patient是未定义的方法/属性吧?你应该是想筛选patient字段为true的用户?如果是这样,得把Scope改成明确的条件查询,不然Rails会因为找不到patient相关的关联或方法,错误地加载整个User表的所有数据,当数据量很大时直接就把内存撑爆了。

修正后的models/user.rb代码:

class User < ActiveRecord::Base
  # 明确筛选patient为true且customer_id不为空的用户
  scope :active_customers, -> { where(patient: true).where.not(customer_id: nil) }
end

2. Active Admin的Scoped Collection未完成

你在Active Admin的控制器里写的scoped_collection方法只写了一半:

def scoped_collection
  User.active...
end

这种不完整的调用也会导致查询逻辑异常,进一步引发内存问题。咱们得补全成正确的Scope调用:

修正后的admin/customer.rb代码:

ActiveAdmin.register User, as: "Customer" do
  menu priority: 8, label: proc{ I18n.t "admin.financial_report" }, parent: 'dev'
  actions :index
  controller do
    def scoped_collection
      # 调用正确的自定义Scope
      User.active_customers
    end
  end
end

为什么会出现NoMemoryError?

原来的错误代码会触发两个问题:

  • 错误的Scope语法让Rails无法生成正确的SQL查询,转而加载全表数据到内存,数据量大时直接导致内存分配失败。
  • 未完成的scoped_collection调用进一步破坏了查询逻辑,加重了内存负担。

把这两处修正后,Active Admin就能正确调用active_customers Scope,生成高效的SQL查询,不会再一次性加载大量数据导致内存溢出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:32