Ciao,
Mi sono imbattuto in una query strana su cui non riesco proprio a mettere la testa, realizzabile solo con una query SQL/Active Record.
Ho argomenti con campi personalizzati e devo ordinare i dati in base al valore del campo personalizzato ‘importedSortDate’.
Codice iniziale:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
Come posso modificare o aggiungere a questa query in modo da caricare in memoria solo quei 10 argomenti e non di più?
Dato che il modello della tabella dei Campi Personalizzati è un po’ strano, nel senso che hai una colonna ‘name’ e una colonna ‘value’, sono un po’ bloccato su come gestire esattamente tutto questo tramite una query al database.
Il mio problema nel caricare di più in memoria è il fatto che per ogni argomento caricato in memoria vengono eseguiti anche dei fetch per la categoria, l’utente e il post.
Sto lavorando con 1000-2000 argomenti per categoria e ho 4 categorie da cui recuperare i dati.
Il recupero viene effettuato da tutti gli utenti, non è un’operazione una tantum.
Come vedo le cose, finora ho due modi per farlo (il primo non sembra abbastanza veloce per me):
- Ottenere solo gli ID di tutti gli argomenti che mi interessano in un’unica fetch e poi usare quelle informazioni per unire in qualche modo il valore di ‘importedSortDate’, quindi fare un ordinamento in memoria e successivamente eseguire di nuovo una fetch per gli ID nello stesso ordine in cui li ho (ancora non so esattamente come funzionerebbe)
- In qualche modo creare una query che fa un join con la tabella dei campi personalizzati (ho visto alcuni esempi, ma erano per valori fissi nelle colonne ‘name’ e ‘value’) e ordinare tutto in base alle colonne ‘name’ === ‘importedSortDate’ e alla colonna ‘value’ (stringa ISO8601)
Come posso ottenere questo risultato?
PS Alcuni argomenti potrebbero non avere un valore nel campo personalizzato ‘importedSortDate’, quindi potrei semplicemente recuperarli e posizionarli dove voglio, ma è un caso limite con cui posso gestire. Se non hanno un valore, dovrebbero essere le prime voci.
PPS In seguito voglio usare questa query come mia query di paginazione; la logica è già implementata da quella parte, devo solo cambiare la query principale per il recupero degli argomenti.