12

我正在开发一个使用 ActiveAdmin 作为其管理后端的项目。

我有两个模型,一个包含多个产品的 Book 模型。当我尝试访问 ActiveAdmin 中的产品索引视图时,它似乎尝试将完整的书籍表加载到内存中(我的数据库中大约有 150 万本书)。CPU 使用率高达 100%,内存使用率飙升至千兆字节。

打开 mysql 日志记录确认这是调用此视图时发生的情况:

17 Query     SELECT `books`.* FROM `books`

据我所知,这发生在任何尝试加载产品之前。

为了解决这个问题,我将模型剥离到它们的骨架:

class Product < ActiveRecord::Base
  belongs_to :book
end

class Book < ActiveRecord::Base
  has_many :products
end

我还将 AA 定义简化为最基本的形式:

ActiveAdmin.register Product do
end

这对 ActiveAdmin 来说正常吗?这似乎不是理想的行为。

4

2 回答 2

36

对于处理同样问题的任何人,我最终将其追溯到 ActiveAdmin 中自动生成的侧边栏。这包括一个搜索字段,该字段包括一个用于所有关联记录的选择框。

如果您像我一样有一个包含超过一百万条记录的关联表,AA 会很乐意尝试将整个表插入到选择框中。

答案是在产品的 AA 定义中包含一些自定义过滤器,如下所示:

ActiveAdmin.register Product do
  filter :title
end

这样就不会包含关联(除非您自己指定。)

于 2013-09-05T22:31:24.000 回答
1

现在更好的方法是使用remove_filter特定的属性或关系:

或者您也可以删除过滤器并仍然保留默认过滤器:

preserve_default_filters!
remove_filter :id

https://activeadmin.info/3-index-pages.html

于 2020-11-06T20:17:09.980 回答