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 对象实例化时,您可能会遇到很多意想不到的问题(不要忘记 AR 会DailyStat为返回的每一行实例化一个对象,无论它是否有意义或不是),所以你最好坚持使用原始 SQL / 纯 Arel select_all

如果您的 RDBMS 允许,另一个要考虑的选项是使用 DB 视图。稍加修改,就可以使用 AR 模型来访问数据库视图,就好像它是一张表一样......这非常有用。

于 2013-01-28T17:08:45.550 回答