Rails-活动记录:查找所有具有某些属性的has_many关联计数的记录

德里克·马尔(Derrick Mar)

用户具有许多身份。

class User < ActiveRecord::Base
    has_many :identities
end

class Identity < ActiveRecord::Base
    belongs_to :user
end

身份具有一confirmed:boolean列。我想查询所有只有一个身份的用户。还必须确认此身份为假。

我已经试过了

User.joins(:identities).group("users.id").having( 'count(user_id) = 1').where(identities: { confirmed: false })

但是,这将返回具有一个身份的用户,confirmed:false 但是如果确认他们是真实的,他们还可以具有其他身份。我只希望只有一个已确认身份的用户:false,并且没有已确认属性为true的其他身份

我也尝试过这样做,但是显然它很慢,我正在寻找合适的SQL来在一个查询中执行此操作。

  def self.new_users
    users = User.joins(:identities).where(identities: { confirmed: false })
    users.select { |user| user.identities.count == 1 }
  end

如果已经回答了这个问题,请提前道歉,但我找不到类似的帖子。

德里克·马尔(Derrick Mar)

一种解决方案是使用Rails嵌套查询

User.joins(:identities).where(id: Identity.select(:user_id).unconfirmed).group("users.id").having( 'count(user_id) = 1')

这是查询生成的SQL

SELECT "users".* FROM "users"
INNER JOIN "identities" ON "identities"."user_id" = "users"."id"
WHERE "users"."id" IN (SELECT "identities"."user_id" FROM "identities"  WHERE "identities"."confirmed" = 'f')
GROUP BY users.id HAVING count(user_id) = 1

我仍然认为这不是最有效的方法。虽然我只能生成一个SQL查询(意味着仅一个网络调用db),但我仍然必须执行两次扫描:一次在USERS表上扫描,一次在IDENTITIES表上扫描。可以通过为identities.confirmed建立索引来优化此操作,但这仍然不能解决两次完整扫描的问题。

对于那些了解查询计划的人来说,它是:

     QUERY PLAN
-------------------------------------------------------------------------------------------
 HashAggregate  (cost=32.96..33.09 rows=10 width=3149)
   Filter: (count(identities.user_id) = 1)
   ->  Hash Semi Join  (cost=21.59..32.91 rows=10 width=3149)
         Hash Cond: (identities.user_id = identities_1.user_id)
         ->  Hash Join  (cost=10.45..21.61 rows=20 width=3149)
               Hash Cond: (identities.user_id = users.id)
               ->  Seq Scan on identities  (cost=0.00..10.70 rows=70 width=4)
               ->  Hash  (cost=10.20..10.20 rows=20 width=3145)
                     ->  Seq Scan on users  (cost=0.00..10.20 rows=20 width=3145)
         ->  Hash  (cost=10.70..10.70 rows=35 width=4)
               ->  Seq Scan on identities identities_1  (cost=0.00..10.70 rows=35 width=4)
                     Filter: (NOT confirmed)
(12 rows)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails,ActiveRecord,has_many:through:查找没有关联的所有记录

来自分类Dev

Rails:获取具有零个has_many关联的父记录

来自分类Dev

Rails /活动记录,按关联顺序排序/ has_many计数

来自分类Dev

rails 通过记录访问所有 has_many

来自分类Dev

Rails查询仅在所有has_many的关联均为“ true”的情况下选择父记录

来自分类Dev

Rails查找具有多个关联记录的记录

来自分类Dev

获得所有has_many关联在rails中

来自分类Dev

具有has_many关联的Rails N + 1查询

来自分类Dev

Rails 4所属/ has_many关系-删除关联的属性,但保留关联的记录

来自分类Dev

Rails最佳查询来查找所有具有has_many的文章

来自分类Dev

Rails 4活动记录模型has_many通过关联吗?

来自分类Dev

Rails 4活动记录模型has_many通过关联吗?

来自分类Dev

Rails查找所有关联ID匹配的记录

来自分类Dev

Rails 4:通过has_many关联创建新记录

来自分类Dev

Ruby on Rails has_many -- 为单个记录创建关联

来自分类Dev

ActiveRecord如何在Rails中通过has_many:through关系将现有记录添加到关联中?

来自分类Dev

Rails 如何查找存在 has_many 关系的记录?

来自分类Dev

Rails:具有“主”记录的has_and_belongs_to_many

来自分类Dev

Rails Activerecord:如何排除具有多个关联记录的记录

来自分类Dev

如何查找在has_many关联上具有嵌套属性的验证失败的记录?

来自分类Dev

Rails:将属性值添加到has_many:through关联的联接表中的几个新记录中

来自分类Dev

Rails-如何通过has_many关联获取所有(唯一)数据?

来自分类Dev

具有has_many关联上的联接的Rails ActiveRecord模型范围

来自分类Dev

如何在rails 4中创建具有父字段的has_many关联字段

来自分类Dev

如何从Rails中具有has_many关系的表中获取第一条记录和第二条记录?

来自分类Dev

Rails快速找到has_many关联与关联ID数组完全匹配的记录

来自分类Dev

Rails-仅查找存在has_many相关记录的记录

来自分类Dev

Rails 查找除已关联的第二级以外的所有记录

来自分类Dev

删除关联记录会在覆盖 Rails 中的 has_many 关联 getter 后删除原始记录

Related 相关文章

  1. 1

    Rails,ActiveRecord,has_many:through:查找没有关联的所有记录

  2. 2

    Rails:获取具有零个has_many关联的父记录

  3. 3

    Rails /活动记录,按关联顺序排序/ has_many计数

  4. 4

    rails 通过记录访问所有 has_many

  5. 5

    Rails查询仅在所有has_many的关联均为“ true”的情况下选择父记录

  6. 6

    Rails查找具有多个关联记录的记录

  7. 7

    获得所有has_many关联在rails中

  8. 8

    具有has_many关联的Rails N + 1查询

  9. 9

    Rails 4所属/ has_many关系-删除关联的属性,但保留关联的记录

  10. 10

    Rails最佳查询来查找所有具有has_many的文章

  11. 11

    Rails 4活动记录模型has_many通过关联吗?

  12. 12

    Rails 4活动记录模型has_many通过关联吗?

  13. 13

    Rails查找所有关联ID匹配的记录

  14. 14

    Rails 4:通过has_many关联创建新记录

  15. 15

    Ruby on Rails has_many -- 为单个记录创建关联

  16. 16

    ActiveRecord如何在Rails中通过has_many:through关系将现有记录添加到关联中?

  17. 17

    Rails 如何查找存在 has_many 关系的记录?

  18. 18

    Rails:具有“主”记录的has_and_belongs_to_many

  19. 19

    Rails Activerecord:如何排除具有多个关联记录的记录

  20. 20

    如何查找在has_many关联上具有嵌套属性的验证失败的记录?

  21. 21

    Rails:将属性值添加到has_many:through关联的联接表中的几个新记录中

  22. 22

    Rails-如何通过has_many关联获取所有(唯一)数据?

  23. 23

    具有has_many关联上的联接的Rails ActiveRecord模型范围

  24. 24

    如何在rails 4中创建具有父字段的has_many关联字段

  25. 25

    如何从Rails中具有has_many关系的表中获取第一条记录和第二条记录?

  26. 26

    Rails快速找到has_many关联与关联ID数组完全匹配的记录

  27. 27

    Rails-仅查找存在has_many相关记录的记录

  28. 28

    Rails 查找除已关联的第二级以外的所有记录

  29. 29

    删除关联记录会在覆盖 Rails 中的 has_many 关联 getter 后删除原始记录

热门标签

归档