У меня есть следующие отношения в 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 работать? Я пробовал разные комбинации запросов без особой удачи.