SQL неполон при поиске с помощью Ransack - PullRequest
0 голосов
/ 01 мая 2019

У меня есть следующие отношения в Rails: Campaign -has-many- Promise (s)

И у меня есть следующий код Ruby для возврата подробного списка кампаний с количеством обещаний:

def campaigns
  results = Campaign
    .where(user_id: current_user.id)
    .left_outer_joins(:promises)
    .select('campaigns.*', 'COUNT(DISTINCT promises.id) AS promises_count')
    .group('campaigns.id')
    .ransack(params[:q])
    .result(distinct: true)

  render json: {
    results: results.page(params[:page]).per(params[:per_page]),
    total_results: results.count(:id)
  }
end

Все работает нормально, если я не попробую отсортировать по promises_count. Ransack (или что-то еще?) Генерирует следующий SQL для Postgres:

SELECT DISTINCT
  campaigns.*,
  COUNT(DISTINCT promises.id) AS promises_count
FROM "campaigns"
  LEFT OUTER JOIN "promises"
    ON "promises"."campaign_id" = "campaigns"."id"
  LEFT OUTER JOIN "promises" "promises_campaigns"
    ON "promises_campaigns"."campaign_id" = "campaigns"."id"
WHERE "campaigns"."user_id" = 1 GROUP BY campaigns.id;

Работает, но по какой-то причине нет ORDER BY. Когда я сортирую по другим свойствам, все работает нормально. Я думаю, что Ransack чего-то не хватает и обрабатывает promises_count по-другому, потому что это сгенерированное свойство, а не реальное.

В Postgres можно отсортировать, например, ручной запрос с добавлением ORDER BY works:

SELECT DISTINCT
  campaigns.*,
  COUNT(DISTINCT promises.id) AS promises_count
FROM "campaigns"
  LEFT OUTER JOIN "promises"
    ON "promises"."campaign_id" = "campaigns"."id"
  LEFT OUTER JOIN "promises" "promises_campaigns"
    ON "promises_campaigns"."campaign_id" = "campaigns"."id"
WHERE "campaigns"."user_id" = 1
GROUP BY campaigns.id
ORDER BY promises_count desc;

Как мне заставить Ransack работать? Я пробовал разные комбинации запросов без особой удачи.

...