Railsで関連がinclude(プリロード)されているか確認する方法
code: (rb)
class User < ApplicationRecord
has_many :blogs
has_one_attached :logo
end
class Blog < ApplicationRecord
belongs_to :user
end
loaded?
関連がプリロードされているか確認できる
ActiveRecord::Relationに対してではなくオブジェクト単体に対して呼ぶことに注意
code: (rb)
user = User.includes(:blogs).first
user.blogs.loaded? # オブジェクト単体に対して呼ぶ
=> true/false
# 以下だとNG
users = User.includes(:blogs)
users.blogs.loaded?
=> No Method Error
ActiveStorageのwith_attached_attachment_name スコープは以下の2つをまとめてプリロードする
attachment
blob
code: (rb)
users = User.with_attached_logo
user = users.first
user.logo.attachment.loaded? # => true/false
user.logo.blob.loaded? # => true/false
association.loaded?
関連のプリロードだけでなく関連先の情報も確認できる
code: (rb)
user = User.includes(:blogs).first
user.association(:blogs)
=> 関連情報
user.association(:logo_attachment)
=> 関連情報
user.association(:logo_blob)
=> 関連情報
表示される関連情報には以下のようになっている
code: (rb)
@owner=#<User id:1, name:"Alice">, # この関連を持つオブジェクト
@reflection=#<ActiveRecord::Reflection::HasManyReflection ...>, # 関連のメタ情報
@loaded=false, # 関連がロード済みか
@target=[], # 実際にロードされたオブジェクトの配列
@association_ids=nil, # 関連のIDリスト
@scope=nil> # 関連に適用されたスコープ