最近、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
リレーションがロードされている場合は正常に動作しますが、ロードされていない場合はエラーで失敗します。リレーションがロードされていない場合、そのリレーションのサイズ呼び出しにより、本質的にクエリが変更され、ハッシュが返され、コードが中断されることが判明しました。a
a
method undefined
count
それは暗黙の動作ですか?
私にとって、リレーションがロードされたかどうかに応じてメソッドのセマンティクスを変更することは、直感に反することです。