0

最近、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

リレーションがロードされている場合は正常に動作しますが、ロードされていない場合はエラーで失敗します。リレーションがロードされていない場合、そのリレーションのサイズ呼び出しにより、本質的にクエリが変更され、ハッシュが返され、コードが中断されることが判明しました。aamethod undefinedcount

それは暗黙の動作ですか?

私にとって、リレーションがロードされたかどうかに応じてメソッドのセマンティクスを変更することは、直感に反することです。

4

1 に答える 1

0

それが ActiveRecord Relation の仕組みです。それを配列に変換して、サイズを指定できます。

a = Stat.aggregated.to_a  
#in other place
if a.size > 0
  'do stuff'
else
  'do other stuff'
end
于 2013-08-07T14:40:28.327 に答える