Pur avendo interagito con i modelli sia tramite console che tramite il codice dei controller non ci siamo soffermati ad analizzare nel dettaglio i metodi di Active Record utilizzati e le relative opzioni.
Abbiamo visto che i modelli risiedono nella cartella app/models
e per convenzione ad ogni modello corrisponde una tabella. Il nome della tabella è dato dal nome del modello al plurale e le colonne della tabella sono accessibili come attributi del modello. Nel nostro caso, al modello Bookmark
corrisponde la tabella bookmarks
, e se la tabella ha la colonna title
, allora ogni istanza della classe Bookmark
avrà l'attributo title
.
Interrogare il database: il metodo find
Il metodo find
permette di estrarre un numero di istanze di un determinato modello dal database. Utilizzando find
otteniamo l'effetto di un'interrogazione tipo SELECT
.
Per estrarre tutti i bookmark presenti nel database scriviamo Bookmark.find(:all)
che restituisce un array contenente i bookmark; per estrarre un solo bookmark, invece scriviamo Bookmark.find(:first)
che non restituisce un array ma una singola istanza del modello Bookmark
. Nel primo caso otteniamo un array di istanze, nel secondo l'istanza singola.
$ ruby script/console Loading development environment (Rails 2.1.0) >> Bookmark.find(:all).class => Array >> Bookmark.find(:first).class => Bookmark(id: integer, url: string, title: string, description: text, created_at: datetime, updated_at: datetime, rate: integer)
Possiamo ottenere l'array delle istanze ordinato secondo un certo criterio. Utilizziamo l'opzione :order
, come abbiamo fatto in precedenza ordinando i bookmark per titolo:
Bookmark.find(:all, :order => "title")
Possiamo anche ordinare i bookmark per titolo per estrarne il primo.
Bookmark.find(:first, :order => "title")
Possiamo specificare delle regole di ordinamento più complesse del semplice attributo; è possibile ad esempio scrivere:
Bookmark.find(:all, :order => "title DESC")
che restituisce tutti i bookmark in ordine alfabetico inverso, oppure:
Bookmark.find(:all, :order => "rate, title DESC")
che ordina i bookmark secondo l'attributo rate, quindi per titolo decrescente.
Per indicare il numero di bookmark che vogliamo estrarre, utilizzeremo l'opzione :limit
, che si comporta in modo del tutto analogo al corrispondente in SQL. Ad esempio, per estrarre i primi 5 bookmark e ottenere il corrispondente array possiamo scrivere:
Bookmark.find(:all, :limit => 5)
L'opzione :limit
è utilizzabile solo quando in abbinamento al parametro :all
poiché il parametro :first
limita di per sé le istanze estratte a uno.
Creare nuove istanze: new
Abbiamo detto che un'istanza di un modello corrisponde ad una riga della tabella da esso rappresentata. Allo stesso modo, ad ogni nuova istanza corrisponde una nuova riga. Nell'implementazione Rails la creazione di una nuova istanza del modello non crea automaticamente una nuova riga, ma si limita a preparare tutti i dati in memoria in attesa di una esplicita richiesta di salvataggio (con il metodo save
descritto in seguito).
Per creare una nuova istanza si utilizza il metodo new
del modello che ci interessa. Lanciamo dal terminale la console di Rails e creiamo una nuova istanza del modello Bookmark:
$ ruby script/console Loading development environment (Rails 2.1.0) >> b = Bookmark.new => #<Bookmark id: nil, url: nil, title: nil, description: nil, created_at: nil, updated_at: nil, rate: 3>
Osserviamo come la variabile b
ora contiene un'istanza del modello con tutti gli attributi nulli, tranne rate
che abbiamo richiesto essere impostato a 3
per default. Anche l'attributo id
è nullo, poiché l'istanza non è ancora stata salvata nel database.