我有一个ActiveAdmin索引页
ActiveAdmin.register Bill
我正在尝试显示相关模型的链接
index do
column "User" do |bill|
link_to bill.user.name, admin_user_path(bill.user)
end
end
但是我遇到了N + 1查询问题 - 有一个查询来获取每个用户。
有没有办法急于加载帐单的用户?
答案 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的文档