【发布时间】:2017-11-01 23:40:29
【问题描述】:
我正在以Active Admin (Formtastic) 的形式遇到N+1 query problem。加载与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"
【问题讨论】:
标签: ruby-on-rails activeadmin formtastic