我几乎没有想找到一个result.blank的比较?结果[0]所以最后今天我用这两种方法检查了一个查询。
这里的代码,结果变量是@categories,这是一个ActiveRecord结果
此空白检查调用一个额外的db调用,如SELECT COUNT(*)AS count_all
if @categories.blank?
end
但是这里没有显示额外的查询。
if @categories[0]
end
背后有什么逻辑吗?我找不到
答案 0 :(得分:0)
请务必注意,将ActiveRecord查询分配给变量不会返回查询结果。像这样:
@categories = Category.where(public: true)
不返回包含所有公共类别的数组。而是返回定义查询的Relation
。一旦调用需要返回实际记录的关系中的方法,就会执行对数据库的查询,例如each
,load
,count
。
那说:当你在关系上调用blank?
时,Rails需要知道它,关系不会返回一个空数组。因此,Rails执行如下查询:
SELECT COUNT(*) FROM categories WHERE public = 1
因为如果有任何匹配的记录,只有你需要知道的事情才能获取所有记录的查询速度要快得多。
@categories[0]
的工作方式不同。这里需要加载所有记录以使数组包含所有macthing类别,然后返回该数组中的第一条记录。
此时,两个版本仅在查询数据库时运行。但我想你的下一步是迭代记录,如果有的话。如果您使用了第一个版本(blank?
),则表示未加载对象,仅对它们进行计数。因此,Rails需要查询实际记录,这将导致第二个查询。第二个例子([0]
)已经加载了记录,因此不需要秒查询。