Проблема:
Я использую драгоценный камень для сортировки столбцов в таблице. У меня есть 2 модели: кампания и курс. Кампания имеет много курсов, и курс принадлежит одной кампании. Каждый курс имеет несколько участников. В моей таблице Campaigns есть столбец Total Attendees, и я хочу, чтобы он был сортируемым. Таким образом, он суммирует поле total_attendees для каждого курса, принадлежащего одной кампании, и сортирует на основе этой суммы.
Ex. Кампания состоит из 3 курсов, каждый с 10 участниками. В столбце «Общее число участников» таблицы кампании будет показано 30, и его можно будет отсортировать по общему количеству посетителей для всех других кампаний.
Я нашел грабителей:
https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers
и этот вопрос SO: Сортировка ранчо по сумме отношений
и из этого сложено многое из того, что ниже.
Из модели - 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
Ошибка:
Запрос на вымогатель дает мне данные, которые я хочу, но я не знаю, что делать, чтобы получить правильную информацию.
Первоначально, когда я щелкнул ссылку 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 Sort By Sum of Relation : Я много работал над этим, но я не уверен, почему это работает для этого пользователя, а не для меня. Они не показывают, что изменилось, если что-нибудь, в контроллере
- Проблема с Ransack Github для нескольких параметров : Эта проблема не охватывает проблему суммирования столбцов таблицы.
- Rails Ransack Сортировка Поиск на основе определения в модели : Это не относится к моей необходимости сортировки на основе суммированных данных.
- Три способа согнуть самоцвет Рансак : Это похоже на то, что я делал, но я не уверен, почему их работает, а мой нет.