【问题标题】:ActiveAdmin automatically loading full association tableActiveAdmin 自动加载完整的关联表
【发布时间】:2013-08-31 20:26:29
【问题描述】:

我正在开发一个使用 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 来说正常吗?这似乎不是理想的行为。

【问题讨论】:

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


    【解决方案1】:

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

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

    答案是在 AA 定义中为以下产品添加一些自定义过滤器:

    ActiveAdmin.register Product do
      filter :title
    end
    

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

    【讨论】:

    • 刚刚遇到了同样的问题,一个愚蠢的下拉菜单中提取了数千条记录-_- 有点烦人,我必须手动重新输入其余的过滤器,这显然都是自定义的或者没有自定义,但无论如何——胜过让后端崩溃!
    【解决方案2】:

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

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

    preserve_default_filters!
    remove_filter :id
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多