如何将ransacker查询连接到ransack排序搜索参数

时间:2018-11-02 18:23:27

标签: sql ruby-on-rails postgresql ransack

问题:

我正在使用ransack gem对表中的列进行排序。我有2种模式:Campaign和Course。一个运动有许多课程,一个课程属于一个运动。每个课程都有许多total_attendees。 “我的广告系列”表中有一个“参加者总数”列,我希望它可以排序。因此,它将汇总属于一个广告系列的每门课程的total_attendees字段,并根据该总和进行排序。

例如一个运动有3门课程,每门课程有10位参与者。广告系列表格上的“总出席者”列将显示30,并且可以针对所有其他广告系列的总参加者进行排序。

我发现了洗劫者: https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers

这个问题:Ransack sort by sum of relation

然后将下面的内容汇总在一起。

从模型-campaign.rb:

class Campaign < ApplicationRecord
  has_many :courses

  ransacker :sum_of_total_attendees do
    query = "SELECT SUM(r.total_attendees)
              FROM campaigns c
   LEFT OUTER JOIN courses r
                ON r.campaign_id = c.id
          GROUP BY c.id"
    Arel.sql(query)
  end
end

从模型-course.rb:

class Course < ApplicationRecord
  belongs_to :campaign, optional: true
end

查看:

<th scope="col"><%= sort_link(@q, :sum_of_total_attendees, 'Total Attendees') %></th>

控制器-campaigns_controller.rb:

all_campaigns = Campaign.all
@q = all_campaigns.ransack(params[:q])
@campaigns = @q.result

错误:

ransacker查询为我提供了我想要的数据,但是我不知道该怎么做才能获取正确的信息。

最初,当我单击th链接对数据进行排序时,出现此错误:

PG::CardinalityViolation: ERROR: more than one row returned by a 
subquery used as an expression

我不知道发生了什么变化,但是现在我遇到了这个错误:

PG::SyntaxError: ERROR:  syntax error at or near "SELECT"
LINE 1: SELECT "campaigns".* FROM "campaigns" ORDER BY SELECT SUM(r....
                                                   ^
: SELECT "campaigns".* FROM "campaigns" ORDER BY SELECT 
SUM(r.total_attendees)
          FROM campaigns c
    LEFT OUTER JOIN courses r
            ON r.campaign_id = c.id
      GROUP BY c.id ASC

此错误似乎表明ransack搜索参数@q和ransacker查询不能一起使用。此请求中有两个选择,当绝对应该只有一个时,但第一个是来自萨克斯,所以我不确定该如何解决。

如何使用ransack使查询正确排序?

我看过的文章,但似乎不适用于我希望通过这个故事完成的事情:

0 个答案:

没有答案