Sto lavorando a un progetto in questo momento che ha un requisito piuttosto insolito e spero di ottenere qualche consiglio sul modo migliore per gestirlo o anche su alcuni suggerimenti per informazioni che possono aiutarmi a costruire una soluzione.Creazione dinamica di modelli e/o tabelle in Rails
Ok, quindi questo è quello che devo fare. L'applicazione archivia e gestisce vari tipi di file multimediali, ma ogni distribuzione dell'applicazione ha requisiti di metadati completamente diversi per i file multimediali.
Questi metadati possono contenere un numero arbitrario di campi di tipi diversi (testo a riga singola, testo a più righe, caselle di controllo, valori selezionati, ecc.) E spesso richiedono convalida in particolare convalide di presenza e unicità.
L'applicazione deve essere in grado di recuperare facilmente i valori e , soprattutto, deve essere in grado di gestire le funzionalità di ricerca complete su questi campi.
Un'opzione che ho preso in considerazione era l'utilizzo di una disposizione di elenchi di proprietà in cui la tabella del database conteneva semplicemente un nome e un valore di proprietà per ciascun campo di metadati di ciascun file multimediale. Tuttavia, durante la prototipazione di questa soluzione è apparso subito evidente che semplicemente non sarebbe stato abbastanza efficiente per la ricerca e il recupero di record, in particolare quando il database può essere abbastanza grande per es. una distribuzione recente aveva 3000 file multimediali e c'erano oltre 20 campi di metadati. Inoltre, le query per effettuare una ricerca e recuperare i record rilevanti sono diventate rapidamente molto complesse.
Un'altra opzione che il sistema sta attualmente utilizzando è che la configurazione dei metadati viene definita in anticipo e durante la distribuzione viene eseguita una migrazione per creare una tabella e un modello con un nome standard in modo che il modello di supporto possa essere associato al il sistema quindi usa. Questo in genere funziona abbastanza bene, ma causa alcuni problemi significativi di implementazione e test.
Ad esempio, la scrittura dei test di unità diventa molto più difficile quando non si conosce la configurazione fino alla distribuzione. Anche se potrei scrivere una configurazione di esempio e testare il codice in questo modo, non mi consentirà di testare i requisiti specifici di una particolare distribuzione.
Allo stesso modo, in fase di sviluppo, attualmente mi richiede di copiare una migrazione dalla configurazione nella cartella principale, eseguirla, eseguire tutti i test e lo sviluppo e quindi devo ricordare di eseguire il rollback e rimuovere quella migrazione dal principale cartella in modo che l'applicazione sia in uno stato standard. Questo diventa particolarmente difficile quando sto correggendo i bug e ho bisogno di avere l'applicazione in una configurazione specifica per scopi di test e di debug. Cercare di passare da una configurazione all'altra diventa un vero incubo.
Idealmente, ciò che vorrei è poter creare dinamicamente la tabella e il modello incluse le convalide, ecc. Da un file di configurazione all'avvio del server. Sarebbe anche meglio se potessi mantenere più setup di metadati in un database con ciascuno con la propria tabella, in modo che tutto ciò che devo fare per passare da uno all'altro sia modificare il file di configurazione che l'applicazione sta attualmente utilizzando.
Sono sicuro che questo può essere fatto con Rails ma ci sono pochissime informazioni che sono stato in grado di trovare che possono indicarmi la giusta direzione su come costruirlo durante le mie ricerche negli ultimi giorni così qualsiasi aiuto o suggerimento sarebbe molto apprezzato!
Sì, questo è stato anche il mio primo pensiero ed era quello che intendevo fare in origine. Ma quando ho implementato una soluzione prototipo, una ricerca di base solo il recupero dei campi era circa 10 volte più lenta di una normale soluzione basata su tabelle. E quando aggiungi il costo delle ricerche in esecuzione per filtrare i record, diventa rapidamente proibitivo, soprattutto considerando che la funzionalità di ricerca è abbastanza fondamentale per il funzionamento dell'applicazione complessiva. – richard