检查rails中的对象列表是否为空

时间:2014-05-20 09:11:15

标签: ruby ruby-on-rails-3 ruby-on-rails-4

让我说我有这个

@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

4 个答案:

答案 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