3

假设有 2 个模型调用UserPost

“Plan A”或“Plan B”哪个性能更好(更快)?

“A计划”

控制器

@users = User.find_all_by_country(params[:country])
@posts = Post.find_all_by_category(params[:category])

看法

<%= @users.count.to_s %>
<%= @posts.count.to_s %>

“B计划”

控制器

@users = User.find_all_by_country(params[:country])
@posts = Post.find_all_by_category(params[:category])

看法

<%= @users.length.to_s %>
<%= @posts.length.to_s %>
4

2 回答 2

15

在 ruby​​ 中countlengthsize所有关于数组的事情几乎相同。请参阅此处了解更多信息。

然而,当使用ActiveRecord 对象时,count它比 更好lengthsize甚至更好。

find_all_by_country返回一个哑数组,因此您不应该使用该方法(因为它总是返回一个数组)。相反,使用where(country: params[:country]).

我会让Code SchoolRails Best Practices幻灯片 nº 93 说明一切(希望他们不会因为我在这里复制它而生气)。

在此处输入图像描述

以防万一图像被删除,基本上:

  1. length总是提取所有记录,然后在数组上调用 .length - 不好

  2. count总是做一个计数查询 - 好

  3. size如果您有缓存计数器,则查看缓存,否则进行计数查询 - 最好

于 2013-02-10T04:33:09.930 回答
1

两者都是相同的,count没有参数,length并且与您在 Ruby 数组(由魔术方法返回)上调用它们时相同find_*,而不是 ActiveRecord 对象。

也就是说,如果您只是对匹配记录的数量感兴趣,这两种方法都是最糟糕的方法。

与其实例化整个结果集只是为了找到它的长度,.count不如在实际的 ActiveRecord 关系上使用:

@num_users = User.where(country: params[:country]).count
@num_posts = Post.where(category: params[:category]).count

这实际上将作为select count(*) from而不是 full执行select * from,这将根据结果的数量而更快。

于 2013-02-10T03:50:16.930 回答