rails query left inner includes active mysql sql ruby-on-rails activerecord subquery

mysql - query - Los rieles seleccionan subconsulta(sin finder_sql, si es posible)



rails sql query (1)

Puede hacerlo más fácil si genera la subconsulta por separado y utiliza una combinación en lugar de una subconsulta correlacionada:

subquery = Schedule.select(''MIN(price) as min_price, object_id'').group(:object_id).to_sql Object.joins("JOIN (#{subquery}) schedules ON objects.p_id = schedules.object_id"). select(''objects.*, schedules.min_price).limit(5)

Tengo un modelo llamado Object (realmente no importa de qué se trata)

Tiene un precio predeterminado (la columna se llama "precio").

Y luego hay un objeto Schedule que permite anular el precio para fechas específicas.

Quiero poder determinar el precio MÍNIMO (que es, por definición, el MÍNIMO entre el precio predeterminado y "actual") durante la consulta SQL solo para poder PEDIR POR el precio mínimo calculado

Quiero que mi consulta de búsqueda sea lo más eficiente posible y me preguntaba si puedo hacer algo como eso:

Object.select("id AS p_id, id, (SELECT MIN(`schedules`.`price`) FROM `schedules` WHERE `schedules`.`object_id` = p_id`) AS objects.min_price").limit(5)

Pero, genera un SQL impar que se ve así:

SELECT `objects`.`id` AS t0_r0, `objects`.`title` AS t0_r1, `objects`.`created_at` AS t0_r2, `objects`.`updated_at` AS t0_r3, `objects`.`preferences` AS t0_r4 ........ (a lot of columns here) ... ` WHERE `objects`.`id` IN (1, 2, 3, 4 ....)

Entonces, como pueden ver, no funciona. En primer lugar, carga todas las columnas de la tabla de objetos y, en segundo lugar, se ve horrible.

La razón por la que no quiero usar finder_sql es que tengo muchos parámetros opcionales y cosas así, por lo que es preferible usar el objeto AR :: Relation antes de obtener los resultados.

Además de lo mencionado anteriormente, tengo muchos registros en el DB, y creo que cargarlos a todos en la memoria no es una buena idea y esa es la razón principal por la que quiero realizar esta subconsulta, solo para filtrar como muchos registros como sea posible.

¿Alguien puede ayudarme a cómo hacerlo de manera más eficiente?