Кодовое предложение для вложенной группировки ActiveRecord |Рельсы 5.2 - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над проектом, который должен сделать некоторые базовые статистические отчеты.Например, модель Post имеет поле внешнего ключа category_id, относящееся к записи в модели Category, и логическое поле published со значением по умолчанию false (наряду с title, body, author - но они не имеют отношения к этому вопросу).

Я хочу настроить и создать вложенную группировку для итерации по модели Post и группировки записей Post по их Category, а затем в каждой категории, далее группировать по состоянию published поле, чтобы дать count для каждой группы, чтобы отобразить результат, подобный следующему:

Categories
Tutorial
  Published: 14 posts
  Draft:     3 posts
Q & A
  Published: 14 posts
  Draft:     3 posts
Letter
  Published: 14 posts
  Draft:     3 posts

Ниже приведен нефункциональный код, с которого я начал:

<% @posts.group(:category).each do |category| %>
  <% category.label %>

  <% category.each.group(:published).count.each do |published_status, count| %>
    <%= published_status %>: <%= pluralize(count, "post") %>
  <% end %>
<% end %>

Буду очень признателен за любые отзывы или предложения о том, как изменить приведенный выше код.Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Пожалуйста, попробуйте ниже запрос, он не проверен, но я думаю, что он должен работать

НЕ ИСПЫТАНО

categories = Category.left_outer_joins(:posts)
                                .select("
                                       Categories.label, 
                                       (SELECT COUNT(posts.id) from posts where posts.published=true) as published_count, 
                                       (SELECT COUNT(posts.id) from posts where posts.published=false) as draft_count
                                       ")
                                .group('categories.id')

В представлении

<% categories.each do |category| %>
  <%= category.label %>
  <%= category.published_count %>
  <%= category.draft_count %>
<% end %>
...