Запрос Active Record, чтобы найти родителей с ребенком в диапазоне дат и ребенка до этого диапазона - PullRequest
0 голосов
/ 09 октября 2019

Мне нужен запрос активной записи, который возвращает количество родителей с дочерним элементом, созданным в диапазоне дат, и дочерним элементом, созданным до диапазона дат.

В настоящее время у меня есть два следующих запроса: Этот запрос возвращаетколичество родителей с ребенком, созданным в диапазоне дат

Parent.joins(:children).where("children.created_at BETWEEN ? AND ?", start, end).distinct.count(parent_id)

Этот запрос подсчитывает количество родителей с ребенком, созданным до диапазона дат

Parent.joins(:children).where("children.created_at < ?", start).distinct.count(:parent_id)

Мне нужно найти количествоРодители, у которых есть дочерний элемент, созданный в диапазоне И дочерний элемент, созданный до диапазона.

Как наилучший способ получить этот результат?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы можете сделать это следующими способами,

Простым способом, получить идентификаторы для родителя из первого запроса и применить фильтр по родительскому идентификатору во втором запросе,

 q1_pids = Parent.joins(:children)
                 .where("children.created_at BETWEEN ? AND ?", start, end)
                 .ids
 count = Parent.joins(:children)
               .where("children.created_at < ?", start)
               .where(id: q1_pids)
               .count("parents.id")

ИспользованиеINTERSECT

q1 = Parent.joins(:children)
           .where("children.created_at BETWEEN ? AND ?", start, end)

q2 = Parent.joins(:children)
           .where("children.created_at < ?", start)

count = (q1 & q1).count

Второе решение просто использует пересечение массива , однако вы можете самостоятельно подготовить оператор SQL для запуска одного запроса SQL к базе данных.

1 голос
/ 09 октября 2019

Расширяя ответ @ Sujan, вы также можете получить все записи в одном запросе.

Parent.joins(:children)
      .joins('INNER JOIN children AS before_start_children ON before_start_children.parent_id = parents.id')
      .where(children: {created_at: start..end})
      .where("before_start_children.created_at < ?", start)
      .distinct
      .count(parent_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...