我正在尝试使用它所代表的对象类型加入聚合表。
以下是聚合表的简化架构:
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中获取的各自计数合并?
这是一个更具描述性的现实生活用例:
查询汇总表item_type: people
,其中包含特定的给定数据范围,结果按计数排序。
查询聚合表格查询返回的人模型 item_ids 。
将人对象与相应的聚合表结果合并,例如:People#count
我尝试用左外连接完成此操作是徒劳的。这样做的正确方法是什么?
运行PostgreSQL 9.1和Rails 3.2.8
答案 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")
您应该可以在Aggregation
或People
或两者上使用条件。
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