sql - 如何将 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 正确排序?
我看过但似乎不适用于我希望通过这个故事完成的文章:
- Ransack 按关系总和排序:这是我经常工作的一个,但我不确定为什么它适用于这个用户而不是我。他们不显示控制器中发生的变化(如果有的话)
- Ransack Github Issue For Multiple Params:这不包括汇总表列的问题。
- Rails Ransack 基于模型中的定义进行排序搜索:这不适用于我需要根据汇总数据进行排序。
- 弯曲 Ransack Gem 的三种方法:这看起来像我在做的事情,但我不确定为什么他们的工作有效,而我的却没有。
解决方案
推荐阅读
- bash - 如何使用脚本对包含名称的文件进行排序?
- java - 关于反转 JAVA 单词顺序的基本 Java 编码问题
- java - java程序下载工件并进行比较
- javascript - 如何在 javascript 中创建具有多个用户的动态 memoize 函数
- laravel - 3张表的雄辩关系
- opencv - 查找轮廓在模拟图像上发现太多轮廓
- ios - 如何创建免费的苹果开发者帐户以创建 ips 文件而无需在 swift 中配置配置文件
- powershell - PowerShell 脚本根据文件名将文件移动到文件夹?
- angularjs - 使用 Asp.net mvc angularjs (data-ng-Init) 在页面加载
- android-studio - 如何使用 Gradle 在 Android Studio 上设置具有过期 SSL 证书的 Maven 存储库?