Индекс 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