空白检查导致额外计数呼叫

时间:2017-02-19 09:49:11

标签: ruby-on-rails ruby

我几乎没有想找到一个result.blank的比较?结果[0]所以最后今天我用这两种方法检查了一个查询。

这里的代码,结果变量是@categories,这是一个ActiveRecord结果

此空白检查调用一个额外的db调用,如SELECT COUNT(*)AS count_all

if @categories.blank?
end

但是这里没有显示额外的查询。

if @categories[0]
end

背后有什么逻辑吗?我找不到

1 个答案:

答案 0 :(得分:0)

请务必注意,将ActiveRecord查询分配给变量不会返回查询结果。像这样:

@categories = Category.where(public: true)

不返回包含所有公共类别的数组。而是返回定义查询的Relation。一旦调用需要返回实际记录的关系中的方法,就会执行对数据库的查询,例如eachloadcount

那说:当你在关系上调用blank?时,Rails需要知道它,关系不会返回一个空数组。因此,Rails执行如下查询:

SELECT COUNT(*) FROM categories WHERE public = 1

因为如果有任何匹配的记录,只有你需要知道的事情才能获取所有记录的查询速度要快得多。

@categories[0]的工作方式不同。这里需要加载所有记录以使数组包含所有macthing类别,然后返回该数组中的第一条记录。

此时,两个版本仅在查询数据库时运行。但我想你的下一步是迭代记录,如果有的话。如果您使用了第一个版本(blank?),则表示未加载对象,仅对它们进行计数。因此,Rails需要查询实际记录,这将导致第二个查询。第二个例子([0])已经加载了记录,因此不需要秒查询。