0

私は熱心な読み込みとは何かを知っており、他の熱心な読み込みに関する質問について 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化され、すぐに加算されます。ユーザーのコレクションのすべてのアクティビティを熱心にロードする方法はありますか?

4

1 に答える 1

0

解決済みであることを明確にするために、これに回答を投稿しています。できるようになったら、これを正しい答えとして受け入れます。

Baldrick のコメントを見て、アクティブな組織にのみアクティビティが記録されるように、ユーザーのアクティビティを正確に除外する方法について考えさせられました。私が演じていた:

user.activities.where("organization_id = ?", org.id)

私が何をしたかに関係なく、毎回クエリを強制します。だから私はそれを次のように変更しました:

user.activities.select { |o| o.id == org.id }

これは、私が望んでいたことを実行するようになりました(@Baldrickの推奨の後も)。

于 2013-07-02T07:12:18.273 に答える