2

キャンペーンの分析を表示したい。ここにいくつかのコンテキストがあります:

  • キャンペーン統計は、特定の広告についてさまざまな企業によって収集されます
  • 多くの場合、統計は複数の会社によって同じ広告に対して生成されます
  • 統計は、DailyStat と呼ばれるモデルで収集されます
  • 各キャンペーンには、統計を収集している場合と収集していない場合がある多数の企業が関与しています。
  • キャンペーンと企業は、キャンペーンを通じて関連付けられます

キャンペーン -> 広告 -> DailyStat

DailyStats は、統計を生成する会社に応じて、広告と会社の両方に属します。

モデルは次のようになります。

class DailyStat < ActiveRecord::Base
  attr_accessible :ad, :clicks, :company, :date, :impressions

  belongs_to :ad
  belongs_to :company
end

class Ad < ActiveRecord::Base  
  belongs_to :campaign
  has_many :daily_stats
end

class Campaign < ActiveRecord::Base
  has_many :campaignizations, :dependent => :destroy
  has_many :companies, :through => :campaignizations

  has_many :ads, :dependent => :destroy
end

class Company < ActiveRecord::Base

  has_many :campaignizations, :dependent => :destroy
  has_many :campaigns, :through => :campaignizations

end

今、私が最も効率的にやりたいことは次のとおりです。

  • 特定のキャンペーンのインプレッションの概要を取得する (会社別)
  • 特定のキャンペーン (会社別) の各広告のインプレッションの概要を取得する

ActiveRecord を初めて使用するので、インクルード、合計などをいじってみましたが、キャンペーンから企業グループの統計情報を取得する方法について頭を悩ませているようには見えません (すべての広告を反復処理することはできません)。

私が持っている質問:

  1. これに取り組むための効率的なアプローチは何でしょうか?
  2. 非正規化してキャンペーン情報を DailyStats に追加することは理にかなっていますか?
4

1 に答える 1

1

やや複雑ですが、arel / ARを使用して複雑な集計計算を実行することは可能です...ここに例があります(それが機能するかどうかはわかりませんが、精神は得られます):

特定のキャンペーンのインプレッションの概要を取得する(会社別):

DailyStat
  .joins(  company: {campaignizations: :campaign} )
  .where(  Campaign.arel_table[:id].eq arbitrary_id )
  .group(  DailyStat.arel_table[:company_id] )
  .select([ 
             DailyStat.arel_table[:impressions].sum, 
             DailyStat.arel_table[:company_id] 
          ])

私が言ったように、これが機能するかどうかはわかりません-グループを使用してANDオブジェクトのインスタンス化を選択すると、多くの予期しない問題が発生する可能性があります(ARDailyStatは、意味があるかどうかにかかわらず、返された行ごとにオブジェクトをインスタンス化することを忘れないでくださいそうではないので、生のSQL/純粋なArelに固執する方がよいでしょうselect_all

RDBMSで許可されている場合、考慮すべきもう1つのオプションは、DBビューを使用することです。少しハッキングすることで、ARモデルを使用して、テーブルであるかのようにDBビューにアクセスすることができます...これは非常に役立ちます。

于 2013-01-28T17:08:45.550 に答える