我正在研究一个使用ActiveAdmin进行管理后端的项目。

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

打开mysql日志记录,确认这是在调用该 View 时发生的情况:

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是否正常?这似乎不是理想的行为。

最佳答案

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

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

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

ActiveAdmin.register Product do
  filter :title
end

这样,将不包括该关联(除非您自己指定它。)

关于ruby-on-rails - ActiveAdmin自动加载完整的关联表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18552496/

10-13 02:15