Sql ActiveRecord:具有总和、联接、分组依据和选择多个字段的复杂查询

Sql ActiveRecord:具有总和、联接、分组依据和选择多个字段的复杂查询,sql,ruby-on-rails,postgresql,ruby-on-rails-4,activerecord,Sql,Ruby On Rails,Postgresql,Ruby On Rails 4,Activerecord,我为这个问题花了几天时间,但仍然没有找到解决方案 这是我的模型 我需要查询select objects.importance和sum of user_objects.score。但我也必须只选择那些属于user1和user2的对象进行查询 我为select objects.importance编写了一个查询 Object.select("objects.importance").joins(:user_objects). w

我为这个问题花了几天时间,但仍然没有找到解决方案

这是我的模型

我需要查询select objects.importance和sum of user_objects.score。但我也必须只选择那些属于user1和user2的对象进行查询

我为select objects.importance编写了一个查询

Object.select("objects.importance").joins(:user_objects).
                                    where(user_objects: {user_id: [user1_id,user2_id]}).
                                    group(objects: :id).
                                    having('COUNT("user_objects"."id")=2')
它被转换成

SELECT objects.importance FROM "objects" INNER JOIN "user_objects" ON "user_objects"."the_object_id" = "objects"."id" WHERE "user_objects"."user_id" IN (2, 7) GROUP BY "objects"."id" HAVING COUNT("user_objects"."id")=2
当我执行这个查询时,我得到了这个响应

[#<Object id: nil, importance: 0.5>, #<Object id: nil, importance: 0.5>]
我期望得到这样的回应

[#[<Object id: nil, importance: 0.5>, 0.2], #[<Object id: nil, importance: 0.5>,0.3]]

我将非常感谢您在解决这个问题时能给我的任何帮助。

ª。我找到了解决办法。这里是正确的查询

Object.joins(:user_objects).
       where(user_objects: {user_id: [user1_id,user2_id]}).
       group(objects: :id).
       having('COUNT("user_objects"."id")=2').
       pluck("objects.importance, SUM(user_objects.score)")
问题出在select方法中,因为它创建了调用此方法的类的对象。因此,不可能在一个选择中选择少数模型的属性。但pull返回带有字段值的结果数组,这样我们就可以从不同的表中选择字段。
就这样。太简单了

既然逻辑很简单,为什么不使用原始SQL呢?因为原始SQL可读性较差,而且不是Rails。SQL是关系数据库领域的通用语言。许多框架方言都是苍白的仿制品,实现了功能的残缺子集,甚至在可读性方面也不接近。当然,如果你的母语是芬兰语,你会发现芬兰语比英语更容易阅读。但无论如何都必须转换成SQL,因为这毕竟是RDBMS的语言。SQL本可以设计得更巧妙,但对于英语的怪异方面也是如此,它是世界通用语言,我们在这里使用它。这类似吗?Erwin,您是对的,SQL是一种通用语言,但在Rails代码中,使用ActiveRecord更可取。在那里,英语原始SQL的可读性较差,因为它被芬兰Ruby代码所包围。
Object.select("objects.importance, SUM(user_objects.score)").
       joins(:user_objects).
       where(user_objects: {user_id: [user1_id,user2_id]}).
       group(objects: :id).having('COUNT("user_objects"."id")=2')
[#[<Object id: nil, importance: 0.5>, 0.2], #[<Object id: nil, importance: 0.5>,0.3]]
Object.joins(:user_objects).
       where(user_objects: {user_id: [user1_id,user2_id]}).
       group(objects: :id).
       having('COUNT("user_objects"."id")=2').
       pluck("objects.importance, SUM(user_objects.score)")