Oi,
Encontrei uma consulta estranha com a qual não sei muito bem como lidar usando apenas uma consulta SQL/Active Record.
Tenho tópicos com campos personalizados e preciso ordenar os dados usando o valor do campo personalizado ‘importedSortDate’.
Código inicial:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
Como posso modificar ou adicionar algo a essa consulta para carregar na memória apenas esses 10 tópicos, e não mais?
Como o modelo da tabela de Campos Personalizados é um pouco estranho, no sentido de que você tem uma coluna ‘name’ e uma coluna ‘value’, estou um pouco travado sobre como fazer tudo isso usando apenas a consulta ao banco de dados.
Meu problema ao carregar mais dados na memória é que, para cada tópico carregado, também são realizadas buscas por categoria, usuário e post.
Estou trabalhando com 1000 a 2000 tópicos por categoria e tenho 4 categorias para buscar.
A busca é feita por todos os usuários, não é algo único.
Conforme vejo, tenho até agora 2 formas de fazer isso (a primeira não parece rápida o suficiente para mim):
- Obter apenas os IDs de todos os tópicos que me interessam em uma única busca e, em seguida, usar essa informação de alguma forma para fazer um join com o valor de ‘importedSortDate’, fazer uma ordenação na memória e depois buscar novamente os IDs na mesma ordem em que os tenho (novamente, não sei exatamente como isso funcionaria).
- De alguma forma, criar uma consulta que faça join com a tabela de campos personalizados (já vi alguns exemplos, mas eram para valores fixos nas colunas ‘name’ e ‘value’) e ordenar tudo com base nas colunas onde ‘name’ === ‘importedSortDate’ e na coluna ‘value’ (string ISO8601).
Como posso conseguir isso?
PS: Alguns tópicos podem não ter um valor no campo personalizado ‘importedSortDate’, então eu poderia apenas buscá-los e colocá-los onde quiser, mas é um caso extremo com o qual consigo lidar. Se não tiverem valor, eles devem ser as primeiras entradas.
PPS: Quero usar essa consulta posteriormente como minha consulta de paginação. A lógica já está implementada desse lado; só preciso alterar a consulta principal para buscar os tópicos.