哪个更快“计数”或“长度”?

假设有2个模型叫做UserPost

哪个会更好(快)“A计划”还是“计划B”?

“计划A”

调节器

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

视图

   

“B计划”

调节器

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

视图

   

在ruby中, countlengthsize都与数组完全相同。 有关详细信息,请参见此处

但是,使用ActiveRecord对象时, count优于length ,并且size更好。

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

我会让Code School的Rails最佳实践幻灯片93号为自己说话(希望他们不要因为我在这里复制它而生气)。

在此处输入图像描述

为了防止图像被删除,基本上:

  1. length总是拉出所有记录,然后在数组上调用.length – 糟糕

  2. count始终执行计数查询 – 很好

  3. 如果你有一个缓存计数器, size查看缓存,否则会计数查询 – 最好

两者都是相同的,没有参数的countlength是相同的,因为你在Ruby数组上调用它们(由魔术find_*方法返回),而不是ActiveRecord对象。

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

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

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

这实际上将作为select count(*) from不是完全select * from ,这将取决于结果的数量更快。