单个ActiveRecord模型的复杂分组

时间:2011-05-12 08:12:53

标签: ruby-on-rails ruby-on-rails-3

我迫切需要一些帮助。我的任务是为我们的一个团队投入一个实用工具,用于对数据文件进行一些基本的分析。我现在已经远离编码了一段时间,所以我有点生疏了。我会尽量简明扼要地描述我的问题。

场景:列表运营团队为电子邮件营销活动创建数据文件。营销活动是多分段的;每个段由一个键码识别。记录总数平均约为450,000,文件大小约为20MB。

我们现在遇到了严重的问题,所以市场营销部门希望对分段的gmail,yahoo和hotmail地址的记录数进行一些基本的分析。

当前状态:我创建了一个Rails 3应用,允许用户上传多个文件,并将这些记录保存在MySQL数据库中。

这是数据库记录的基本样本,不包括id和时间戳等标准字段:

domain       eid    keycode  
YAHOO.COM    42886  GY4103  
HOTMAIL.COM  53012  GY4103  
YAHOO.COM    53952  GY4103  
AOL.COM      54327  GY4103  
COMCAST.NET  55134  MX4155  
GMAIL.COM    59157  MX4155  
AOL.COM      59823  MX4155  
AOL.COM      60384  MX4161  
MSN.COM      64720  MX4161  
YAHOO.COM    67790  MX4161
GMAIL.COM    73537  MX4161
YAHOO.COM    76747  MX4161  
HOTMAIL.COM  71467  MX4161
GMAIL.COM    84280  MX4161  

问题:我需要将分析结果呈现给最终用户:

Keycode
GY4103
  Domain       Count
  YAHOO.COM    2
  HOTMAIL.COM  1
  OTHER        1
MX4155
  Domain       Count
  GMAIL.COM    1
  OTHER        2
MX4161
  Domain       Count
  YAHOO.COM    2
  HOTMAIL.COM  1
  GMAIL.COM    2
  OTHER        2

如果我在像Crystal Reports这样的东西,我会按键码分组,然后按域分组,然后根据其进行分组,进行一些调整,只显示我想要的3个域以及其他所有域名“其他“我已经完成了!但是,这里不可能使用CR。

所以我假设我在创建了某种类型的树结构或层次结构,其中Keycode位于顶层,然后是域下的域,并且计数在那之下?我开始看看Ancestry的宝石,但我并没有真正得到它。

任何人都可以提供任何帮助都会非常感激,特别是考虑到我需要在明天中午之前提供这些帮助。

1 个答案:

答案 0 :(得分:2)

我可能会在这里混合使用一些手动SQL,因为它似乎是一个如此大的数据集来处理。也许是这样的:

# CONTROLLER
# Load the data from the database and group on keycode and domain.
# You will only get one record for each unique combination of domain and keycode
@records = MyModel.select("keycode, domain, COUNT(eid) AS eids").group("keycode, domain")

# convert the array of records into a hash where every key is a unique keycode
# and the value is an array of records for all the domains for that keycode
@records = @records.group_by(&:keycode)

# VIEW
<% @records.keys.each do |keycode| %>
  <h1><%= keycode %></h1>
  <% @records[keycode].each do |record| %>
    <p><%= record.domain %>: <%= record.eids %></p>
  <% end %>
<% end %>

我希望我能正确理解一切