Индекс Active Admin с областью действия приводит к NoMemoryError: не удалось выделить память

Работая с Rails 4.2.6, у меня есть эта пользовательская модель с настраиваемой областью действия. Вот мои модели /user.rb:

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

Я пытаюсь отобразить индекс всех active_customers, используя Active Admin, вот мой 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

После проверки результата для рейковых маршрутов я вижу, что нет никакого маршрута для "admin/ customer", но он не ломается ни локально, ни на промежуточном сервере. Любая подсказка о том, почему это происходит?

В моем route.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

Таким образом, хотя разница чисел между средами, я не думаю, что причиной ошибки памяти в производстве является количество пользователей.

Также попытался использовать область, которая работает в Patient.rb в customer.rb, и он потерпел крах:

controller do
  def scoped_collection
    User.patient
  end

После этого я попытался изменить как "Клиент" на "Пользователь" и снова потерпел крах:

  ActiveAdmin.register User, as: "User" do

Если область действия, которая работает в Patient.rb, не работает в customer.rb, это заставляет меня отказаться от идеи, что проблема вызвана просто нехваткой памяти. Я уверен, что проблема связана с тем, как я использую область в активном администраторе или мой синтаксис в customer.rb, но я не могу понять, как это исправить.

1 ответ

Сначала я бы проверил операторы SQL в вашем журнале Rails на наличие чего-либо неожиданного. Для меня не очевидно, что не так, но лично я бы делал обзор на уровне модели ActiveRecord вместо ActiveAdmin, например:

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

ActiveAdmin.register ActiveCustomer do
  ...
end
Другие вопросы по тегам