用ransack搜索时SQL不完整

时间:2019-05-01 04:43:09

标签: ruby-on-rails ruby ransack

我在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工作?我尝试了不同的查询组合,但运气不佳。

0 个答案:

没有答案