0

集計テーブルをそれが表すオブジェクト タイプと結合しようとしています。

集計テーブルの簡略化されたスキーマを次に示します。

集計表

aggregate_table[0] => {
  item_type: 'cars',
  item_id: 8,
  count: 12,
  time: 'Thu, 01 Nov 2012 00:00:00 PDT -07:00'
}

aggregate_table[1] => {
  item_type: 'people',
  item_id: 23,
  count: 48
  time: 'Thu, 01 Nov 2012 00:00:00 PDT -07:00'
}

AggregateTable から取得したそれぞれのカウントとマージされたCarオブジェクトを返すことは可能ですか?

より説明的な実際の使用例を次に示します。

  1. item_type: people指定された特定のデータ範囲とcountで並べ替えられた結果を使用して、集計テーブル where をクエリします。

  2. 集計テーブル クエリによって返されたitem_idsPeopleモデルをクエリします。

  3. Peopleオブジェクトを対応する集計テーブルの結果とマージします。次に例を示します。People#count

左外部結合でこれを達成しようとする私の試みは無駄でした。これを行う正しい方法は何ですか?


PostgreSQL 9.1 と Rails 3.2.8 の実行

4

1 に答える 1

2

ポリモーフィック アソシエーションを使用する必要があります。

Class Aggregation < ActiveRecord::Base
  belongs_to :item, :polymorphic => true
end

また、has_one関連付けられたクラスに逆関連付け (必須ではありませんが、役立つ場合があります) を含めます。

正確なデータベース スキーマについては、上記のドキュメントを参照してください。

それからあなたの質問のために:

1「特定の特定のデータ」と呼ぶものはわかりませんが、次の方法で集計を照会できます。

Aggregation.where(:item_type => "People").order(:count)

2次の行は結果の人物を表示します (むしろ Person/people、Rails 規則を使用する必要があります)

Aggregation.where(:item_type => "People").order(:count).map(&:item)

または

People.joins(:aggregation).order("aggregations.count")

AggregationまたはPeopleその両方で条件を使用できる必要があります。

3本当に「マージ」する必要があるかどうかわかりません。次の行はcountfrom aggregationstable を提供します:

People.joins(:aggregation).order("aggregations.count").each do |p|
  puts p.aggregation.count
end

includes(:aggregation)「人」ごとのクエリを避けるために、おそらく を追加する必要があります。

クラスで使用できるのp.countではなく、書くことができるようにしたい場合:p.aggregation.countdelegatePeople

class People
  delegate :count, :to => :aggregation
end
于 2012-12-05T16:37:26.173 に答える