私は熱心な読み込みとは何かを知っており、他の熱心な読み込みに関する質問について Google と StackOverflow を検索しました。それらのいくつかは啓発的でしたが、私の特定の質問を解決するものはなかったので、自分で質問します.
ここに私のスキーマがあります:
class Organization < ActiveRecord::Base
has_many :activities
has_many :users_logged, source: :user, through: :activities
end
class Activity < ActiveRecord::Base
belongs_to :user
belongs_to :organization
end
class User < ActiveRecord::Base
has_many :activities
end
このプロジェクトは継承されており、スキーマの大幅な再設計を行うことはできないため、スキーマで質問が不可能な場合は、それで問題ありません。すべての組織をロードすることを含む、これらのレポートの生成を高速化することを試みたいだけです。
Organizations.includes(:users_logged).joins(:activities)
ここで、includes(:users_logged)
はすべてのアクティビティをロードしますがjoins(:activities)
、質問にとって重要ではないため、除外した順序付け/グループ化されたフィールドには依然として必要であることに気付きました。
includes(:users_logged)
ここでの問題は、組織の詳細、関連するアクティビティ、および組織のアクティビティを記録したすべてのユーザーが必要になるだけでなく、ディレクティブによって選択されたすべてのユーザーのすべてのアクティビティを熱心にロードしたいということです。それに加えて、ユーザーのすべてのアクティビティをロードする必要があります (理想的には組織に関連付けられていますが、熱心にロードする方法を理解したら、それを解決できます)。
私の現在の実装:
@orgs = Organization.includes(:users_logged).joins(:activities).all
@orgs.each do |org|
org.users_logged.each do |user|
# Just work with user.activities
end
end
これにより、ユーザーあたりのクエリが、現在のテスト データの量で平均0.3 ms
化され、すぐに加算されます。ユーザーのコレクションのすべてのアクティビティを熱心にロードする方法はありますか?