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
相关产品推荐
相关产品推荐

