In un video precedente abbiamo curiosato le caratteristiche di Rails. Sono Simone Carletti ed in questo video esploreremo da vicino una delle librerie base del framework: ActiveRecord.
ActiveRecord è una libreria scritta in Ruby per interagire con le basi di dati ed è uno dei cinque componenti base del framework Rails, la "M" di Model nella sigla MVC.
Tecnicamente parlando ActiveRecord è un ORM. Implementa il pattern Object-Relational Mapping rappresentando ogni tabella del database come una classe, dove un oggetto è un record della tabella e gli attributi costituiscono i campi della tabella. In altre parole, un record della tabella Article è rappresentato da un oggetto della classe article dove il campo Titolo è salvato nell'attributo titolo dell'oggetto.
Rappresentare una tabella come un oggetto offre numerosi vantaggi. Il più importante è quello di poter accedere ai dati in modo più intuitivo ed efficace, senza bisogno di scrivere direttamente codice SQL.
Lavorare con un ORM significa disporre di un'interfaccia unificata di accesso ai dati. In altre parole, con ActiveRecord è possibile utilizzare la stessa sintassi per interagire con un database MySQL, SQLite o PostgreSQL. È la libreria che si occupa di tradurre le espressioni nei comandi SQL corrispondenti. Vediamo alcuni esempi.
Per eseguire una ricerca di un record in una tabella si utilizza il metodo find. Per recuperare tutti gli articoli in un giornale scriveremo: Article.find(:all) o più semplicemente Article.all
Il risultato è un array di oggetti Article, dove ciascuno è un record del database. Per recuperare l'articolo con id 3 scriveremo Article.find(3) oppure Article.find(:all, limit => 5) per i primi 5 articoli. Per contare i record sarà sufficiente chiamare il metodo Article.count con la stessa sintassi.
Per creare un nuovo record, ad esempio un articolo, è sufficiente creare un'istanza della classe Article con Article.new ed impostare i valori per ogni attributo. Una volta preparato l'oggetto, è sufficiente chiamare il metodo save per salvare immediatamente il record nel database. Per modificare un record basta cambiare il valore di una proprietà ed utilizzare nuovamente il metodo save. Infine, per cancellare il record è sufficiente invocare il metodo destroy.
ActiveRecord supporta le relazioni uno a uno, uno a molti e molti a molti. Anche in questo caso tutto avviene attraverso una sintassi object oriented. Per recuperare le categorie di un articolo è sufficiente chiamare article.categories. Per cercare una categoria si utilizza la sintassi di find come visto in precedenza.
Alcuni record richiedono l'esecuzione di metodi o procedure al verificarsi di specifiche condizioni. In ActiveRecord è possibile usare i callback. Ad esempio, possiamo chiamare un metodo prima di salvare un oggetto, prima di crearlo o prima di distruggerlo. L'esempio mostra come crittare la password prima di salvarla nel database.
Spesso è necessario validare un oggetto prima di salvarlo. Per questo esistono decine di validatori per controllare il formato di un campo, la lunghezza, la presenza o l'associazione. Se l'oggetto non supera la validazione il record non viene scritto nel database.
Le transazioni sono uno strumento fondamentale per garantire integrità nei dati. Possiamo definire un gruppo di azioni da eseguire e, in caso di errore, ActiveRecord ripristinerà lo stato precedente alla prima esecuzione in automatico.
ActiveRecord, come anticipato, è parte del framework Rails. È comunque possibile utilizzare questa GEM anche in altri programmi Ruby per sfruttare i vantaggi di uno strumento così potente ed efficace per interagire con i database.