🪲

【Activeadmin】bulletのActiveStorageのeager_load検出を解決した方法

2021/08/11に公開

起きたこと

Activeadmin で、has_one_attached で画像を関連付けて持っているモデルの index を開いた際、以下の eager load が detect された

user: root
GET /admin/model_name
USE eager loading detected
  ActiveStorage::Attachment => [:blob]

Call stack

前提

環境

  • Rails 6.1.3
  • Ruby 3.0.1
  • bullet 6.1.4

モデル

class ModelName < ApplicationRecord
  has_one_attached :image1
  has_one_attached :image2
end

解決法

activeadmin の該当ファイルに以下を追記(app/admin/●●.rb)

  controller do
    def scoped_collection
      super.eager_load(image1_attachment: :blob, image2_attachment: :blob)
    end
  end

activeadmin でない場合も、

.eager_load(image1_attachment: :blob, image2_attachment: :blob)

をクエリに追加すれば動くと思います。

参考

Bullet の issue

https://github.com/flyerhzm/bullet/issues/474

ホワイトリストに指定して該当の検出を無効にする手法が紹介されていましたが自分の環境では動きませんでした。

解決に繋がった記事

https://blog.saeloun.com/2020/03/06/eagerload-active-storage-models.html#eager-loading-associated-records-to-prevent-n--1

この記事に載っていたのはincludesでしたが、そのままだと変化がなかったのでeager_loadに変更したところ問題が解決しました。

Discussion