2016-05-29 5 views
1

У меня есть простой comments таблицу:Вычислить среднее сгруппированных с помощью ActiveRecord/PgSQL

id post_id 
======================= 
1  'a11' 
2  'a11' 
3  'b22' 
4  'b22' 
5  'b22' 

Я вычисляя средние комментарии за сообщение:

comment_counts = Comment.group(:post_id).count.values 
avg = comment_counts.sum/comment_counts.size.to_f 
# => 2.5 

Я бы предпочел, чтобы DB обрабатывать расчет. Как я могу достичь этого, используя только activerecord/sql?

ответ

0

Я не могу думать о очень ActiveRecord-иш способ сделать это, но может предложить следующее:

Comment(:post_id).select("avg(count(*)) over() avg").take.avg 

... который возвращает BigDecimal или тому, вероятно, более эффективным:

ActiveRecord::Base.connection.execute("select avg(c_star) from (select count(*) c_star from comments group by post_id) t").first["avg"].to_d 

Мне кажется, что это не учитывает сообщения, которые не получили Комментариев.

Смежные вопросы