From e4d5b2f3bece0f5f3e5f588e20e52031ad33e124 Mon Sep 17 00:00:00 2001 From: "M.Shibuya" Date: Fri, 22 Oct 2021 17:44:01 +0900 Subject: [PATCH] Fix N+1 queries for ActiveStorage attachments Closes #3282 --- lib/rails_admin/config/fields/types/active_storage.rb | 4 ++++ .../config/fields/types/multiple_active_storage.rb | 4 ++++ spec/rails_admin/config/fields/types/active_storage_spec.rb | 6 ++++++ .../config/fields/types/multiple_active_storage_spec.rb | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/lib/rails_admin/config/fields/types/active_storage.rb b/lib/rails_admin/config/fields/types/active_storage.rb index d0ce0966c2..affb6da485 100644 --- a/lib/rails_admin/config/fields/types/active_storage.rb +++ b/lib/rails_admin/config/fields/types/active_storage.rb @@ -22,6 +22,10 @@ class ActiveStorage < RailsAdmin::Config::Fields::Types::FileUpload end end + register_instance_option :eager_load do + {"#{name}_attachment": :blob} + end + def resource_url(thumb = false) return nil unless value if thumb && value.variable? diff --git a/lib/rails_admin/config/fields/types/multiple_active_storage.rb b/lib/rails_admin/config/fields/types/multiple_active_storage.rb index d049d2868f..7157adf8b9 100644 --- a/lib/rails_admin/config/fields/types/multiple_active_storage.rb +++ b/lib/rails_admin/config/fields/types/multiple_active_storage.rb @@ -43,6 +43,10 @@ def resource_url(thumb = false) register_instance_option :delete_method do "remove_#{name}" if bindings[:object].respond_to?("remove_#{name}") end + + register_instance_option :eager_load do + {"#{name}_attachments": :blob} + end end end end diff --git a/spec/rails_admin/config/fields/types/active_storage_spec.rb b/spec/rails_admin/config/fields/types/active_storage_spec.rb index 47ff5feff9..c582290945 100644 --- a/spec/rails_admin/config/fields/types/active_storage_spec.rb +++ b/spec/rails_admin/config/fields/types/active_storage_spec.rb @@ -84,4 +84,10 @@ end end end + + describe '#eager_load' do + it 'points to associations to be eager-loaded' do + expect(field.eager_load).to eq({active_storage_asset_attachment: :blob}) + end + end end if defined?(ActiveStorage) diff --git a/spec/rails_admin/config/fields/types/multiple_active_storage_spec.rb b/spec/rails_admin/config/fields/types/multiple_active_storage_spec.rb index 6afb772319..c5c1e4d098 100644 --- a/spec/rails_admin/config/fields/types/multiple_active_storage_spec.rb +++ b/spec/rails_admin/config/fields/types/multiple_active_storage_spec.rb @@ -88,4 +88,10 @@ end end end + + describe '#eager_load' do + it 'points to associations to be eager-loaded' do + expect(field.eager_load).to eq({active_storage_assets_attachments: :blob}) + end + end end if defined?(ActiveStorage)