Как связать запрос Ransacker с параметром поиска Ransack Sort - PullRequest
0 голосов
/ 02 ноября 2018

Проблема:

Я использую драгоценный камень для сортировки столбцов в таблице. У меня есть 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?

Статьи, на которые я смотрел, но, похоже, не относились к тому, что я искал, чтобы достичь этой историей:

...