我在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(或其他?)为Postgres生成以下SQL:
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
的作品:
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工作?我尝试了不同的查询组合,但运气不佳。