0

私はモデルとして持っProjectEntryいます。プロジェクトには多くのエントリを含めることができ、エントリはプロジェクトにのみ属します。エントリには日付があります。

レポート要件の1つは、特定の月のエントリがあるプロジェクトを表示することです。私はこれを達成するためにスコープを使用することに成功しましたProject.with_entries.on(param_the_month)

問題は、プロジェクトごとにグループ化された、その月のエントリのみを表示したいということです。すると、エントリ()をprojects.each do |p|クエリするとp.entries、返されるエントリは、指定した月だけでなく、すべての月のものになります。

これは明らかな結果ですが、Railsには、元のチェーンスコープを使用してその月のエントリを返す方法はありますか?

4

3 に答える 3

2

編集:私は誤解しました:)

テイク2:モデル間でスコープをマージできます。したがって、特定の月からエントリを選択するためにwhere-typeスコープを作成できる場合は、次のようなことを試すことができます。Entry

Project.with_entries.on(param_the_month).merge(Entry.on(param_the_month))

私はonあなたのスコープとのアナロジーでそれを呼んでいますProject-あなたのデータモデルを見ずに、私はそれをどのように正確に実装するかを言うことができません。

于 2012-10-04T19:52:45.313 に答える
1

has-manyアソシエーションはスコープも受け入れるため、スコープprojects.entries.your_scopeをフィルタリングすることができます。欠点は、プロジェクトごとに別のデータベースクエリが必要になることです。これは、データベースのサイズによっては遅くなる可能性があります。

追加のクエリを必要としない別の方法は、すでにフィルタリングされたエントリをフェッチしてから、上に移動してプロジェクトを取得することです。

entries = Entry.my_conditions.includes(:project)
entries_by_project = entries.group_by(&:project)

これで、キーがプロジェクトであるハッシュが作成され、値は条件に合格したそのプロジェクトのエントリのみになります。

于 2012-10-04T19:51:14.710 に答える
1

インクルードをスコープに追加できます。これにより、これらのレコードを再度クエリすることはなく、プロジェクトスコープを使用するときにレコードを熱心にロードします。

scope :my_scope, includes(:entries).where( :active => true )
于 2012-10-04T19:51:34.383 に答える