consulta de registro activo para encontrar a los padres con el niño dentro de un rango de fechas y el niño antes de ese rango de fechas

votos
0

Necesito una consulta de registro activo que devuelve el recuento de los padres con un niño creado dentro de un rango de fechas y un niño creado antes del intervalo de fechas.

En este momento tengo las dos consultas siguientes: Esta consulta devuelve el recuento de los padres con un niño creado dentro del intervalo de fechas

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

Esta consulta cuenta los padres con un niño creado antes de que el rango de fechas

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

Necesito encontrar el recuento de los padres que tienen un hijo creado dentro de la gama y un niño creado antes de la gama.

¿Cómo es la mejor manera de conseguir este resultado?

Publicado el 09/10/2019 a las 18:56
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Puede hacerlo de las siguientes formas,

manera simple, obtener los identificadores para los padres de la primera consulta y aplicar el filtro de ID de padre en la segunda consulta,

 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")

usando 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

Segunda solución sólo utiliza intersección gama , sin embargo se puede preparar la instrucción SQL a sí mismo para disparar una sola consulta SQL a la base de datos.

Respondida el 09/10/2019 a las 19:27
fuente por usuario

votos
1

La extensión de la respuesta de @ Sujan, se puede recuperar todos los registros en una sola consulta también.

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)
Respondida el 09/10/2019 a las 19:21
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more