ActiveRecord:具有“求和”,“合并”,“分组依据”和“选择多个字段”的复杂查询

泰蒂亚娜·丘普里纳(Tetiana Chupryna)

我已经花了几天时间进行此查询,但仍然没有找到解决方案。

有我的模特

class UserObject < ActiveRecord::Base
  self.table_name = "user_objects"
  belongs_to :user, class_name: 'User'
  belongs_to :the_object, class_name: 'Object'
end

class Object < ActiveRecord::Base
  self.table_name = 'objects'

  has_many :user_objects, class_name: 'UserObject', foreign_key: :the_object_id, inverse_of: :the_object
  has_many :users, through: :user_objects
end

class User < ActiveRecord::Base
  self.table_name = "users"
end

这是我的图式

  create_table "objects", force: true do |t|
    t.float    "importance",        default: 0.5, null: false
  end

  create_table "user_objects", force: true do |t|
    t.integer  "user_id"
    t.integer  "the_object_id"
    t.float    "score",              default: 0.0,   null: false
  end

  create_table "users", force: true do |t|
    t.string   "first_name"
    t.string   "last_name"
  end

我需要选择objects.importance和总和的查询user_objects.score但是我还必须选择仅查询objects属于user1和的那些查询user2

我写了一个查询来查询选择对象。

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>]

可以响应的对象数量可以。但是我仍然不知道如何计算这个查询总和user_objects.score下一个查询不起作用

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]]

我非常感谢您在解决此问题方面可以给我的任何帮助。

泰蒂亚娜·丘普里纳(Tetiana Chupryna)

Ок。我找到了解决方案。这是正确的查询。

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方法上,因为它创建调用此方法的类的对象因此,不可能选择select几种模型的一种属性。但是pluck返回带有字段结果数组,因此我们可以从不同的表中选择字段。就是这样。很简单!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MYSQL查询选择具有相同列和分组依据的

来自分类Dev

选择具有最大字段/列值的实例/行(每个字段/列)(分组依据)

来自分类Dev

选择具有左外部联接的查询,并与分组依据求和

来自分类Dev

选择分组依据并对具有相同数量的列求和

来自分类Dev

具有多个联接,max()和分组依据的慢速MySQL查询

来自分类Dev

具有实体和分组依据的Linq查询

来自分类Dev

具有总和,联接和分组依据的Mysql子查询

来自分类Dev

具有多个字段的子查询

来自分类Dev

Linq查询使用分组依据并具有

来自分类Dev

Linq查询具有分组依据

来自分类Dev

具有多个索引的分组依据

来自分类Dev

具有多个变量的分组依据

来自分类Dev

在SQL中使用分组依据获取多个字段的计数

来自分类Dev

从具有不同和限制的列中选择多个字段

来自分类Dev

从具有不同和限制的列中选择多个字段

来自分类Dev

具有多个字段和“ display”属性的CSS选择器

来自分类Dev

meteor.js和mongoDB-具有多个字段的查询

来自分类Dev

选择大熊猫分组依据数据框的子集,其中多个键具有值

来自分类Dev

ES中具有多个字段的通配符查询?

来自分类Dev

Postgres分组依据并提取具有多个元素的分组

来自分类Dev

Django查询多个分组依据

来自分类Dev

使用联接,分组依据和聚合函数的SQL选择查询

来自分类Dev

MS Access选择按多个字段分组的前n个查询

来自分类Dev

MS Access选择按多个字段分组的前n个查询

来自分类Dev

选择带有和不带有分组依据的列

来自分类Dev

LINQ选择和分组依据

来自分类Dev

多个分组依据和计数

来自分类Dev

带有查询和分组依据的 SQL Sum

来自分类Dev

具有多个JOINS的复杂选择逻辑

Related 相关文章

热门标签

归档