2014-05-20 24 views
0

空白可以說我有這個檢查對象的名單是在軌

@objects = SampleObject.all 

然後我想檢查@objects是空白的,我可以在FF:

unless @objects.blank? 
@objects.each do |object| 
end 
else 
.. 
end 

然而,這樣做會引發鐵軌執行SELECT COUNT(*)查詢

如此相反,我可以做類似

unless @objects.length > 0 

有沒有辦法覆蓋給定一個特定的類.blank?

def self.empty? 
    self.length > 0 ? false : true <br> 
end 

回答

2

您應該使用ActiveRecord::Relation#any?方法:

if @objects.any? 
    # ... 
end 

這是(在這種情況下)ActiveRecord::Relation#empty?方法的否定:

unless @objects.empty? 
    # ... 
end 
+0

感謝您的方法。 – rav

+0

但是,感謝那種方法,當我測試它時,mini-profiler告訴我rails通過.any從「對象」觸發了SELECT COUNT(*)。方法 – rav

+0

@rav ok,那麼你的目標是什麼?你想如何(因爲在我看來,生成'select count(*)...'查詢是檢查是否有任何記錄的最好方法)? –

0

SampleObject.allActiveRecord::Relation對象,可以使用blank?也。

空白? - 如果關係是空白的,則返回true

因此,你可以爲

unless @objects.blank? 
    # ... 
end 
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 
1

空白?使用空?因爲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?

那麼,它真的取決於天氣集合是否加載? 爲@Marek說,因此COUNT通話雙方empty? & any?使用SELEC COUNT(*)如果集合未加載(reference),我想你的情況SampleObject.all將延遲加載。

對於你的情況,我不認爲你可以避免COUNT調用,因爲你想獲取所有記錄並且急切地加載所有記錄只是爲了避免第二次調用db只是覺得毫無意義(通過導致更大的一個來解決一個性能問題),但如果它的一個子集合,我相信將不會有第二個COUNT呼叫。