使用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中使用活动管理员或我的语法中的作用域的方式有关,但我无法弄清楚如何修复它。
答案 0 :(得分:1)
我首先检查Rails日志中的SQL语句是否有任何意外情况。这对我来说并不明显有什么不对,但我个人会在ActiveRecord模型级别而不是ActiveAdmin进行范围界定,例如:
class ActiveCustomer < User
default_scope { where.not(customer_id: nil) }
end
ActiveAdmin.register ActiveCustomer do
...
end