使用1个查询计算和选择ActiveRecord中的对象

时间:2009-10-27 00:10:06

标签: sql ruby-on-rails ruby activerecord

我们想要在堆栈中表示对象(想想在MMO中​​堆叠项目)。会有重复的行。

假设我们的owned_objects表看起来像这样。

user_id | object_id
1       | 27
1       | 27
3       | 46
3       | 46
5       | 59

我想要查询

SELECT
  user_id,
  object_id,
  count(*) AS count
FROM owned_objects
GROUP BY
  user_id,
  object_id;

并返回3个不同的OwnedObject s(或者甚至只是让不同的Object s也能正常工作)和与之相关的计数。

我知道SQLAlchemy可以实现这一点,但是你能用ActiveRecord吗?

2 个答案:

答案 0 :(得分:3)

怎么样......

@objects = user.objects.all(:select => "count(*) as count, objects.*", :group => :object_id)

...或类似的?

然后,您可以通过每个对象上动态创建的属性检索计数:

@object.first.count # the "stack depth" of the first object.

这假定用户为has_and_belongs_to_many :objectshas_many :objects, :through => :owned_objects

答案 1 :(得分:0)

找到一个解决方案,但不确定它是否最干净(希望不是)。

基本上我创建了一个SQL视图来执行该查询并为其创建模型。有一个用于识别迁移视图的rails插件。