我在Active Admin(Formtastic)表单中遇到了一个N+1查询问题。当加载与
生成
belongs_to
关联对应的选择输入时,会发生查询。相关模型上的display_name
引用另一个belongs_to
关联。以下是模型之间的关系::user
|-- belongs_to :alum
|-- belongs_to :graduation_class
|-- year
以下是模型的相关部分:
app/models/user.rb
class User < ApplicationRecord
...
belongs_to :alumn, optional: true, touch: true
...
end
app/models/alumn.rb
class Alumn < ApplicationRecord
belongs_to :graduation_class, touch: true
delegate :year, to: :graduation_class
has_many :users
...
def display_name
"#{year}: #{last_name}, #{first_name} #{middle_name}"
end
...
end
这是相关的 Active Admin 类:
app/admin/user.rb
ActiveAdmin.register User do
...
includes :alumn, alumn: :graduation_class
...
form do |f|
f.inputs do
f.input :alumn # This is causing the N+1 query
...
end
end
...
end
生成
f.input :alumn
选择字段导致了graduation_class
的N+1查询。这是因为Formtastic通过调用alumn.display_name
来生成选择选项,而alumn.display_name
会调用关联的graduation_class
上的year
方法。我的问题是,如何在此表单中急切加载graduation_class
?在Active Admin类中使用includes :alumn, alumn: :graduation_class
似乎不起作用。
更新:
我可以从服务器日志中看到,GraduationClass
已被加载,但仍然无法消除N+1查询:
GraduationClass Load (0.6ms) SELECT "graduation_classes".* FROM "graduation_classes"
includes :alumn, { :alumn => :graduation_class }
,但它没有起作用。 - Tom Aranda