Методы Kaminari next_page, prev_page и total_count не работают с агрегатными функциями - PullRequest
0 голосов
/ 18 марта 2020

Это начало происходить после обновления с Rails 3 до Rails 5 (с использованием activemodel 5.2.4.1 с Postgresql). Единственное, что я внес в это изменение, - это добавление Arel. sql () в необработанные части запросов. Не уверен, почему он ломается сейчас со следующей ошибкой:

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "community"
LINE 7: ...hived" = $1 GROUP BY community.id) subquery WHERE "community...
                                                             ^
: SELECT COUNT(*) FROM (SELECT 1 FROM "community" LEFT OUTER JOIN ( SELECT people.community_id,
      COUNT(people.id) as count,
      SUM(people.amount) as sum
          FROM people
          WHERE people.status = 'processed'
          GROUP BY people.community_id )
      AS all_people ON all_people.community_id = community.id WHERE "community"."archived" = $1 GROUP BY community.id) subquery WHERE "community"."archived" = $2):

Запрос в модели:

  scope :index_community, -> () do
    all.joins(Arel.sql("
      LEFT JOIN ( SELECT people.community_id,
      COUNT(people.id) as count,
      SUM(people.amount) as sum
          FROM people
          WHERE people.status = 'processed'
          GROUP BY people.community_id )
      AS all_people ON all_people.community_id = community.id
      ")).select(Arel.sql("
        community.*,
        SUM(all_people.count) as number_of_people
      ")).group('community.id')
  end

в контроллере:

per_page = 30
query = Community.index_community
@communities = query.page(params[:page]).per(per_page)
@next_page = query.page(params[:page]).per(per_page).next_page
@previous_page = query.page(params[:page]).per(per_page).prev_page
@total_count = @communities.total_count

в индексе. json .jbuilder:

json.results @communities do |community|
  json.name community.name
  json.number_of_people community.number_of_people.to_i
  json.action do
    json.edit edit_admin_community_path(community)
    json.view admin_community_path(community)
    json.delete admin_community_path(community)
  end
end

json.next_page @next_page

json.previous_page @previous_page

json.total_page @total_count

Я могу использовать методыless_count () на next_page и prev_page, но это не помогает с total_count.

...