Hola,
Me he topado con una consulta extraña sobre la cual no sé muy bien cómo plantearla usando solo una consulta SQL/Active Record.
Tengo temas con campos personalizados y necesito ordenar los datos utilizando el valor del campo personalizado ‘importedSortDate’.
Código inicial:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
¿Cómo puedo modificar o añadir a esta consulta para cargar en memoria solo esos 10 temas y no más?
Dado que la plantilla de la tabla de campos personalizados es un poco extraña, en el sentido de que tienes una columna ‘name’ y una columna ‘value’, estoy un poco atascado sobre cómo lograr hacer todo esto usando una consulta a la base de datos.
Mi problema al cargar más datos en memoria es el hecho de que por cada tema que cargo en memoria, también se realizan búsquedas para la categoría, el usuario y la publicación.
Estoy trabajando con 1000-2000 temas por categoría y tengo 4 categorías de las cuales obtener datos.
La búsqueda la realizan todos los usuarios, no es algo que se haga una sola vez.
Tal como lo veo, tengo dos formas de hacerlo hasta ahora (la primera no parece lo suficientemente rápida para mí):
- Obtener solo los IDs de todos los temas que me interesan en una sola búsqueda y luego usar esa información de alguna manera para unirla con el valor de ‘importedSortDate’, hacer un ordenamiento en memoria y luego realizar nuevamente una búsqueda para los IDs en el mismo orden en que los tengo (de nuevo, no sé exactamente cómo funcionaría eso).
- De alguna manera crear una consulta que se una a la tabla de campos personalizados (he visto algunos ejemplos, pero eran para valores fijos en las columnas ‘name’ y ‘value’) y ordenar todo esto basándose en las columnas donde ‘name’ === ‘importedSortDate’ y la columna ‘value’ (cadena iso8601).
¿Cómo puedo lograr esto?
PD: Algunos temas pueden no tener un valor en el campo personalizado ‘importedSortDate’, por lo que podría simplemente obtenerlos y colocarlos donde quiera, pero es un caso límite con el que puedo lidiar. Si no tienen un valor, deberían ser las primeras entradas.
PPD: Quiero usar esta consulta posteriormente como mi consulta de paginación; la lógica ya está implementada en ese lado, solo necesito cambiar la consulta principal para obtener los temas.