让我说我有这个
@objects = SampleObject.all
然后我想检查@objects是否为空白,我可以使用ff:
unless @objects.blank?
@objects.each do |object|
end
else
..
end
但是,这样做会触发rails执行SELECT count(*)查询
所以相反,我可以做类似
的事情unless @objects.length > 0
有没有办法覆盖给定特定类的.blank?
?
说
def self.empty?
self.length > 0 ? false : true <br>
end
答案 0 :(得分:2)
您应该使用ActiveRecord::Relation#any?
方法:
if @objects.any?
# ...
end
这是(在这种情况下)否定ActiveRecord::Relation#empty?
方法:
unless @objects.empty?
# ...
end
答案 1 :(得分:1)
空白?使用empty?,因为blank?
源代码:
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 13
def blank?
respond_to?(:empty?) ? empty? : !self
end
现在有关 empty? 的文档说:
如果集合为空,则返回true。
如果收藏了 加载或者提供:counter_sql选项,它相当于 collection.size.zero?
如果尚未加载集合,则为 相当于collection.exists?。
如果尚未收藏 已加载,你打算获取记录,无论如何它更好 检查collection.length.zero?
那么,这真的取决于天气是否加载了集合?
empty?
和&amp; any?
使用SELEC COUNT(*)
如果未加载集合(reference),我认为在您的情况下,SampleObject.all
将被延迟加载,因为@Marek说,{{1}调用。
对于你的情况,我不认为你可以避免COUNT
调用,因为你想获取所有记录并急于加载所有记录只是为了避免第二次调用db只是感觉毫无意义(通过以下方式解决一个性能问题)导致更大的一个),但如果它是一个子集,我相信不会有第二个COUNT
电话。
答案 2 :(得分:0)
SampleObject.all
提供了ActiveRecord::Relation
个对象,您也可以使用blank?
。
空白? - 如果关系为空,则返回true
因此你可以写为
unless @objects.blank?
# ...
end
答案 3 :(得分:0)
您可以致电ActiveRecord::Relation#to_a
立即执行查询:
@objects = SampleObject.all.to_a # runs the query, returns an array
if @objects.any? # no query, this is Enumerable#any?
# ...
end