Область сортировки рансаков с аргументами - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть модель сайта с уведомлением об отношениях.На сайте есть несколько уведомлений каждый день.Я пытаюсь подсчитать сумму уведомлений за несколько дней и хочу отсортировать сайты по этой сумме.

class Site
  has_many :notifications
  scope :sort_by_notifications_between_dates_asc, -> (start_date, end_date) { left_joins(:notifications).merge(Notification.between_dates(start_date, end_date)).order(Arel.sql("count(notifications.*) asc")) }
  scope :sort_by_notifications_between_dates_desc, -> (start_date, end_date) { left_joins(:notifications).merge(Notification.between_dates(start_date, end_date)).order(Arel.sql("count(notifications.*) desc")) } 
end

class Notification
  belongs_to :site
  scope :between_dates, -> (start_date, end_date) {where(self.arel_table[:created_at].gteq(start_date.at_beginning_of_day).and(self.arel_table[:created_at].lteq(end_date.at_end_of_day)))} 
end

Для Ransack возможно создать область для сортировки, но я не нашел способачтобы передать аргументы (start_date и end_date) в эту область.

= sort_link(@q, :notifications_between_dates, t('.notifications_between_dates'), default_order: :desc)

Мне не нужно фильтровать сайты по дате.Мне нужно отсортировать сайты по сумме уведомлений за период времени.Это вообще возможно?

1 Ответ

0 голосов
/ 22 февраля 2019

Я нашел половину решения.Я создал ransacker с аргументами

ransacker :notifications_between_dates, args: [:parent, :ransacker_args] do |parent, args|
start_date, end_date = args
query = <<-SQL
 COALESCE(
  (SELECT COUNT(notifications.*) 
     FROM notifications
    WHERE notifications.site_id = sites.id
      AND notifications.created_at >= '#{start_date}'
      AND notifications.created_at <= '#{end_date}' 
    GROUP BY notifications.site_id)
 ,0)
SQL
Arel.sql(query)
end

Затем мы можем сортировать записи следующим образом

q = Site.ransack(sorts: [{name: :notifications_between_dates,
                           dir: 'asc',
                ransacker_args: [Time.now-20.days,Time.now]}])

Но похоже, что sort_link помощник не поддерживает передачу ransacker_args через GET-запросв с параметр.

...