gpt4 book ai didi

ruby-on-rails - ActiveRecord_Relation 对象的大小

转载 作者:行者123 更新时间:2023-12-04 16:30:37 24 4
gpt4 key购买 nike

我有以下查询:

User.joins(:posts).group('users.id').having('count(user_id) > 1')

返回的类是User::ActiveRecord_Relation

如果我对其调用 .size,它会返回一个散列。如果我调用 .size.size,我会返回正确的尺寸。

这真的是我应该如何获取 ActiveRecord_Relation 的大小,否则正确的方法是什么?

最佳答案

了解为什么在此处调用 #size 时会得到哈希值很重要。

如果关联尚未加载,

#size 将执行 SELECT COUNT(*) 查询。这相当于调用 #count。所以你得到一个散列。

但是如果关联已经以某种方式加载到内存中,#size 将不会执行任何额外的查询,但会获取关联的长度。在这种情况下,哈希的长度。在控制台中尝试以下操作:

query = User.joins(:posts).group('users.id').having('count(user_id) > 1'); #don't load the association 
query.size # => hash
query.size # => length of the previous hash

所以依赖链接 #size 在这里不是一个好主意,除非你确定关联不会在此之前加载。相反,为此使用 #length:

User.joins(:posts).group('users.id').having('count(user_id) > 1').length  # => integer

#length 不执行额外的查询,并且总是将整个关联加载到内存中,因此它有点慢并且更饥饿。但在实践中,除非您要加载大量记录,否则这通常不是问题。

顺便说一下,如果您只想查找发表了多个帖子的用户数量,则不需要#join:

Post.group('user_id').having('count(user_id) > 1').length

关于ruby-on-rails - ActiveRecord_Relation 对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46044481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com