Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Operazioni con i modelli: find e new

Interrogare il database utilizzando i modelli e creare nuove istanze
Interrogare il database utilizzando i modelli e creare nuove istanze
Link copiato negli appunti

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.

Ti consigliamo anche