Независимый от базы данных групповой подсчет различных «дней go» в Rails 6 - PullRequest
1 голос
/ 08 апреля 2020

Я хочу выяснить, на сколько разных 24-часовых интервалов произошло слово (обратите внимание, что фактическое приложение отличается и является более сложным, но это эквивалентно и не требует контекста).

Я мог бы сделать это с SQL запросом, подобным этому в Postgresql:

SELECT
  word,
  COUNT(DISTINCT FLOOR(EXTRACT(EPOCH FROM AGE(created_at)) / 86400)) AS num_distinct_days_with_occurrence
FROM word_occurrences
GROUP BY word

Мне даже удалось написать код Rails, который генерирует этот запрос:

WordOccurrence.select(:word).group(:word).distinct.count('FLOOR(EXTRACT(EPOCH FROM AGE(created_at)) / 86400)')

Однако, это не работает в Sqlite3 с тем же кодом.

Полагаю, если я потрачу какое-то время, я мог бы также найти способ заставить его работать в Sqlite3, но я не могу понять, как получить оба на работу. Я видел, что API подсчета имел больше функций в прошлых версиях rails, но я думаю, что даже этого будет недостаточно, учитывая, что моя главная проблема - обработка временных меток, а не подсчет. Кроме того, я не мог понять, где эти функции были в Rails 6.

Есть ли способ заставить это работать для обоих адаптеров? И если нет, то как лучше всего обработать такие фрагменты кода, зависящего от базы данных, и выбрать правильный?

Пример данных:

[
  { word: 'a', created_at: '2020-01-10 22:30' },
  { word: 'a', created_at: '2020-01-10 23:30' },
  { word: 'a', created_at: '2020-01-11 22:30' },
  { word: 'b', created_at: '2020-01-10 22:30' }
]

Если я сделаю запрос в 2020-04- 08, я должен получить такой результат:

[
  { word: 'a', num_distinct_days_with_occurrence: 2 },
  { word: 'b', num_distinct_days_with_occurrence: 1 }
]
...