2013-08-07 74 views
0

我最近遇到了ActiveRecord Relation的一些奇怪行爲。 假設,我有一個Stat模型具有以下性的判定:ActiveRecord關係大小奇怪行爲

  • clicks
  • views
  • created_at
  • 和其他

進一步假設我有以下範圍:

scope :aggregated, select('SUM(clicks) as clicks, SUM(views) as views).group('DATE(created_at)') 

因此,我期望得到一個Stat對象的數組,並且每天都會彙總信息,所以它是這樣的。但是現在考慮這個問題:

# in one place 
a = Stat.aggregated  
#in other place 
if a.size > 0 
    'do stuff' 
else 
    'do other stuff' 
end 

而且如果a關係加載,當未加載a它失敗method undefined錯誤它工作正常。 事實證明,當關系未加載大小調用count在那個關係,實質上改變查詢,返回一個散列,並剎車的代碼。

這是一種隱含的行爲嗎?

對我來說,根據關係是否被加載,改變方法語義是一種反直覺。

回答

0

這就是ActiveRecord關係的工作原理。你可以將它轉換成一個數組並在其上做一個大小。

a = Stat.aggregated.to_a 
#in other place 
if a.size > 0 
    'do stuff' 
else 
    'do other stuff' 
end