带有范围的Active Admin索引导致NoMemoryError:无法分配内存

时间:2018-04-12 14:32:19

标签: ruby-on-rails ruby-on-rails-4 activeadmin custom-scope

使用Rails 4.2.6,我有一个带有自定义范围的用户模型。这是我的models / user.rb:

class User < ActiveRecord::Base
  scope :active_customers, -> { patient.where.not(customer_id: nil) }

我正在尝试使用Active Admin显示所有active_customers的索引,这是我的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
    User.active_customers
  end
end

它在本地和暂存中工作,但它在生产服务器中崩溃。

我已经为所有在每个环境中都能完美运作的患者提供了索引。这是admin / patient.rb:

ActiveAdmin.register User, as: "Patient" do
 menu priority: 1, label: proc{ I18n.t "admin.users" }
 permit_params [:nickname, :name, :surname, :email, :password, :password_confirmation, :therapist_id, :created_by_admin, :randword, :phone, :active]
 actions :all, except: [:destroy]

 controller do
   def scoped_collection
     User.patient
   end

登录生产中不显示任何SQL查询的跟踪,因为它似乎在之前中断:

Started GET "admin/customers"
Processing by Admin::CustomersController#index
Completed 500 Internal Server Error

在检查rake路由的结果后,我可以看到没有“admin / customers”的路由,但它不会在本地中断服务器。 关于它为什么会发生的任何线索?

在我的routes.rb中我有:

ActiveAdmin.routes(self)

在分期中,我们有:

User.patient.count => 397
Benchmark.realtime { User.patient } => 0.0014501959958579391
User.active_customers.count => 99
Benchmark.realtime { User.active_customers } => 0.0016011869884096086

在制作中:

User.patient.count => 27853
Benchmark.realtime { User.patient } => 0.007111124003131408
User.active_customers.count => 496
Benchmark.realtime { User.active_customers } => 0.0040691940012038685

所以,虽然环境之间的数字不同,但我认为生产中出现内存错误的原因是用户数量。

还试图在customer.rb中使用适用于patient.rb的作用域并且崩溃了:

controller do
  def scoped_collection
    User.patient
  end

之后我尝试更改为:“Customer”为:“User”并再次崩溃:

  ActiveAdmin.register User, as: "User" do

如果在patient.rb中工作的作用域在customer.rb中不起作用,则会让我放弃因为内存不足而引起问题的想法。 很确定问题与我在customer.rb中使用活动管理员或我的语法中的作用域的方式有关,但我无法弄清楚如何修复它。

1 个答案:

答案 0 :(得分:1)

我首先检查Rails日志中的SQL语句是否有任何意外情况。这对我来说并不明显有什么不对,但我个人会在ActiveRecord模型级别而不是ActiveAdmin进行范围界定,例如:

class ActiveCustomer < User
  default_scope { where.not(customer_id: nil) }
end

ActiveAdmin.register ActiveCustomer do
  ...
end