はじめに
Active Storageを用いて画像を呼び出す際にN+1問題に直面したんで、解決方法を書き残しておきます。Active Storageの概要はこちらからどうぞ。
with_attached_attachment_nameを使う
Active Storageにはwith_attached_attachment_name
というスコープが存在します。
with_attached_attachment_name
内ではincludes("#{name}_attachment": :blob)
のように関連付けられたblobをincludeしています。以下のbookを例に見ていきましょう。
model/book.rb
class Book < ApplicationRecord
has_one_attached :book_image
end
has_one_attached
メソッドを使ってActive Storageにbook_image
をアタッチメントしました。これによりwith_attached_book_image
というスコープが作成されます。このwith_attached_book_image
をall
の代わりに使用します。
all
でBookを全件取得した場合
controller/book_controller.rb
class BooksController < ApplicationController
def index
@books = Book.all
end
with_attached_book_image
でBookを全件取得した場合
controller/book_controller.rb
class BooksController < ApplicationController
def index
@books = Book.with_attached_book_image
end
まとめ
Active Storageを扱う際は関連付けられたblobをincludeするwith_attached_attachment_name
を使いましょう。