0

使用 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

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

我已经为所有患者建立了一个索引,该索引在每个环境中都能完美运行。这是管理员/患者.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 路由的结果后,我可以看到“管理员/客户”没有路由,但它在本地也没有中断,也没有登台服务器。关于为什么会发生的任何线索?

在我的 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 中的语法有关,但我不知道如何解决它。

4

1 回答 1

1

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

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

ActiveAdmin.register ActiveCustomer do
  ...
end
于 2018-04-13T13:52:26.703 回答