ActiveAdmin自动加载完整关联表

时间:2013-08-31 20:26:29

标签: ruby-on-rails ruby-on-rails-3 activeadmin

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

我有两个型号,一个包含has_many产品的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是正常的吗?这似乎不是理想的行为。

2 个答案:

答案 0 :(得分:32)

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

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

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

ActiveAdmin.register Product do
  filter :title
end

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

答案 1 :(得分:0)

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

或者您也可以删除过滤器,但仍保留默认设置 过滤器:

preserve_default_filters!
remove_filter :id

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