假设有2个模型叫User
和Post
“A计划”或“计划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 %>
答案 0 :(得分:13)
在ruby中,count
,length
和size
对数组做的几乎完全相同。有关详细信息,请参阅here。
使用 ActiveRecord对象时,count
优于length
,size
更好。
find_all_by_country
返回一个哑数组,因此你不应该使用该方法(因为它总是返回一个数组)。相反,请使用where(country: params[:country])
。
我会让Code School的Rails Best Practices幻灯片93为自己说话(希望他们不要因为我在这里复制它而生气)。
以防图像被删除,基本上是:
length
总是拉出所有记录,然后在数组上调用.length
count
总是进行计数查询 - 好
size
查看缓存,否则进行计数查询 - 最好
答案 1 :(得分:1)
两者都是相同的,count
没有参数,length
是相同的,因为你在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
执行,根据结果的数量,这会更快。