我最近遇到了一些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
,这实质上会更改查询,返回一个哈希值,并对代码进行制动。
这是隐含行为吗?
对我来说,根据是否加载关系来改变方法语义是违反直觉的。
答案 0 :(得分:0)
这就是ActiveRecord Relation的工作原理。您可以将其转换为数组并在其上执行大小。
a = Stat.aggregated.to_a
#in other place
if a.size > 0
'do stuff'
else
'do other stuff'
end