ActiveRecord关系大小奇怪的行为

时间:2013-08-07 13:23:17

标签: ruby-on-rails ruby activerecord

我最近遇到了一些ActiveRecord Relation的奇怪行为。 假设我有Stat模型,具有以下特性:

  • 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

如果<{1}}关系已加载工作正常,但如果未加载a,则会因a错误而失败。 事实证明,当没有加载关系时,大小会在该关系上调用method undefined,这实质上会更改查询,返回一个哈希值,并对代码进行制动。

这是隐含行为吗?

对我来说,根据是否加载关系来改变方法语义是违反直觉的。

1 个答案:

答案 0 :(得分:0)

这就是ActiveRecord Relation的工作原理。您可以将其转换为数组并在其上执行大小。

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