我正在开发一个使用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是正常的吗?这似乎不是理想的行为。
答案 0 :(得分:32)
对于处理同一问题的任何人,我最终将其追溯到ActiveAdmin中自动生成的侧边栏。这包括一个搜索字段,其中包含所有相关记录的选择框。
如果你有一个超过一百万条记录的关联表,就像我一样,AA会很乐意尝试将整个表插入到选择框中。
答案是在AA定义中包含一些自定义过滤器,如下所示:
ActiveAdmin.register Product do
filter :title
end
这样就不会包含关联(除非你自己指定。)
答案 1 :(得分:0)
现在更好的方法是对特定属性或关系使用remove_filter
:
或者您也可以删除过滤器,但仍保留默认设置 过滤器:
preserve_default_filters! remove_filter :id