[英]Active Admin index with scope results in NoMemoryError: failed to allocate memory
使用Rails 4.2.6时,我有一个带有自定义范围的用户模型。 这是我的模型/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
之后,我尝试将as:“ Customer”更改为as:“ User”,然后再次崩溃:
ActiveAdmin.register User, as: "User" do
如果在Patient.rb中起作用的范围在customer.rb中不起作用,这使我放弃了仅由于内存不足而引起问题的想法。 可以肯定的是,问题与我在活动管理员中使用作用域的方式或在customer.rb中使用语法有关,但我不知道如何解决它。
首先,我将检查Rails日志中的SQL语句是否有意外情况。 对我来说,错在哪里不是很明显,但是我个人会在ActiveRecord模型级别而不是ActiveAdmin上进行范围界定,例如:
class ActiveCustomer < User
default_scope { where.not(customer_id: nil) }
end
ActiveAdmin.register ActiveCustomer do
...
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.