Rails:如何使用聚合表中的数据连接模型?

时间:2012-12-05 03:09:29

标签: sql ruby-on-rails ruby postgresql activerecord

我正在尝试使用它所代表的对象类型加入聚合表。

以下是聚合表的简化架构:

汇总表

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'
}

是否可以将 Car 对象与从AggregateTable中获取的各自计数合并?

这是一个更具描述性的现实生活用例:

  1. 查询汇总表item_type: people,其中包含特定的给定数据范围,结果按计数排序。

  2. 查询聚合表格查询返回的模型 item_ids

  3. 对象与相应的聚合表结果合并,例如:People#count

  4. 我尝试用左外连接完成此操作是徒劳的。这样做的正确方法是什么?


    运行PostgreSQL 9.1和Rails 3.2.8

1 个答案:

答案 0 :(得分:2)

您应该使用polymorphic associations

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

并在相关联的类中包含has_one反向关联(不是必需但可能有用)。

请参阅上面的文档以获取确切的数据库架构。

然后问你的问题:

1 我不确定您所谓的“特定给定数据”,但您可以通过这种方式查询聚合:

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

2 以下行将为您提供最终的人员(您应该使用人/人,Rails惯例)

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

或者

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

您应该可以在AggregationPeople或两者上使用条件。

3 我不确定你真的需要“合并”。以下行将从count表格中提供aggregations

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

您应该添加includes(:aggregation)以避免每个“人”的查询。

如果您希望能够写p.count而不是p.aggregation.count,可以在delegate课程中使用People

class People
  delegate :count, :to => :aggregation
end