渴望在ActiveAdmin sql查询中加载相关模型

时间:2011-12-14 18:34:47

标签: ruby-on-rails activerecord activeadmin

我有一个ActiveAdmin索引页

ActiveAdmin.register Bill

我正在尝试显示相关模型的链接

index do
  column "User" do |bill|
   link_to bill.user.name, admin_user_path(bill.user)
  end
end

但是我遇到了N + 1查询问题 - 有一个查询来获取每个用户。

有没有办法急于加载帐单的用户?

4 个答案:

答案 0 :(得分:29)

在另一篇文章中有一个答案,但它很好地描述了你需要做什么。

  controller do
    def scoped_collection
      Bill.includes(:user)
    end
  end

在这里,您需要确保遵循范围。因此,如果您的控制器是scope_to'ed,那么您将需要使用scope_to'ed参数替换上面的模型名称。

答案 1 :(得分:26)

执行此操作的方法是覆盖scoped_collection方法(如Jeff Ancel的回答中所述),但调用super以保留现有范围。这样您就可以保留ActiveAdmin应用的任何分页/过滤,而不是从头开始。

ActiveAdmin.register Bill do
  controller do
    def scoped_collection
      super.includes :user
    end
  end

  index do
    column "User" do |bill|
     link_to bill.user.name, admin_user_path(bill.user)
    end
  end
end

正如http://activeadmin.info/docs/2-resource-customization.html

的官方文件中所述

答案 2 :(得分:1)

重要编辑注意:以下内容实际上是 false ,请参阅注释以获得解释。然而,我把这个答案留在原地,因为看起来我并不是唯一一个被指南弄糊涂的人,所以也许别人会发现它很有用。

我认为

class Bill < ActiveRecord::Base
  belongs_to :user
end

所以according to RoR guides它已经急于加载:

  

没有必要使用:包含直接关联 - 也就是说,   如果你有订单belongs_to:customer,那么客户就是   在需要时自动加载。

你应该查看你的SQL日志是否属实(不知道我自己,我只是验证了:include的某些内容,当我看到这个时就回答你...让我知道)

答案 3 :(得分:1)

当时的答案是正确的,但是ActiveAdmin现在支持使用更方便的语法进行快速加载:

ActiveAdmin.register Bill do
  includes :user
end

请参阅resource customization的文档