首页 > 解决方案 > 如何将 ransacker 查询连接到 ransack 排序搜索参数

问题描述

问题:

我正在使用 ransack gem 对表中的列进行排序。我有 2 个模型:活动和课程。一个活动有很多课程,一个课程属于一个活动。每门课程都有一些 total_attendees。我的活动表有一个列代表参加者总数,我希望它是可排序的。因此,它将汇总属于单个活动的每门课程的 total_attendees 字段,并根据该总和进行排序。

前任。一个活动有 3 门课程,每门课程有 10 名参与者。活动表上的参加者总数列将显示 30,并且可以针对所有其他活动的参加者总数进行排序。

我找到了ransackers: https ://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers

还有这个问题:Ransack sort by sum of relationship

并由此汇集了下面的很多内容。

来自模型-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,所以我不知道如何解决它。

如何让我的查询通过 ransack 正确排序?

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

标签: sqlruby-on-railspostgresqlransack

解决方案


推荐阅读