Fel*_*ger 2 activerecord ruby-on-rails rails-activerecord ruby-on-rails-5
我有以下查询:
User.joins(:posts).group('users.id').having('count(user_id) > 1')
Run Code Online (Sandbox Code Playgroud)
返回的类是User::ActiveRecord_Relation。
如果我调用.size它,它会返回一个哈希值。如果我打电话,.size.size我会得到正确的尺寸。
这真的是我应该如何获得 ActiveRecord_Relation 的大小,或者正确的方法是什么?
重要的是要了解为什么在调用#size此处时会得到哈希值。
#sizeSELECT 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
Run Code Online (Sandbox Code Playgroud)
因此,在#size此处依赖链接并不是一个好主意,除非您确定在此之前不会加载关联。相反,#length为此使用:
User.joins(:posts).group('users.id').having('count(user_id) > 1').length # => integer
Run Code Online (Sandbox Code Playgroud)
#length不执行额外的查询,并且总是将整个关联加载到内存中,所以它有点慢而且更饿。但实际上这通常不是问题,除非您加载大量记录。
顺便说一句,如果您只想找到具有多个帖子的用户数量,则不需要#join:
Post.group('user_id').having('count(user_id) > 1').length
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |