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

Operazioni con i modelli: save e destroy

Rendere persistente un'istanza sul database e cancellare istanze già presenti
Rendere persistente un'istanza sul database e cancellare istanze già presenti
Link copiato negli appunti

Abbiamo visto come creare una nuova istanza di un modello tramite il comando new. In questa lezione vediamo come rendere persistente una modifica al database e come effettuare la cancellazione dei record.

Salvare un'istanza: save

Dopo aver creato una nuova istanza di un modello, questa non è ancora effettivamente presente sul database. Continuando l'esempio della scorsa lezione, dopo l'istruzione new, con cui abbiamo creato un'istanza del nostro bookmark, chiamata b, non abbiamo ancora un record nella tabella bookmarks che corrisponda alla nuova istanza. Dobbiamo rendere l'istanza persistente:

>> b.save
=> true

Il metodo save può essere utilizzato sia per la creazione di un nuovo record della tabella, sia per il salvataggio di un record già esistente, ovvero per effettuare un'UPDATE. Per esempio, estraiamo il primo bookmark presente sul database e ne modifichiamo l'attributo rate. Infine salviamo le modifiche sul database.

>> b = Bookmark.find(:first)
=> #<Bookmark id: 1, url: "http://ruby.html.it", title: "Ruby su HTML.it", descr
iption: "Home page della sezione Ruby. Guide, articoli di ap...", created_at: "2
008-06-02 00:20:12", updated_at: "2008-06-08 14:06:06", rate: 3>
>> b.rate
=> 3
>> b.rate = 5
=> 5
>> b.save
=> true

Il metodo save riconosce l'istanza come corrispondente ad un record della tabella e non creerà quindi un nuovo record, ma modificherà quello già esistente.

Eliminare le istanze: destroy

Per eliminare un record dalla tabella Active Record mette a disposizione il metodo destroy; facciamo subito un esempio pratico servendoci della console: supponiamo di voler eliminare il bookmark con id pari a 5:

>> b = Bookmark.find(5)
=> #<Bookmark id: 5, url: "http://www.google.com", title: "Google", description:
 "Motore di ricerca", created_at: "2008-06-24 14:27:38", updated_at: "2008-06-24
 14:27:38", rate: 3>
>> b.destroy
=> #<Bookmark id: 5, url: "http://www.google.com", title: "Google", description:
 "Motore di ricerca", created_at: "2008-06-24 14:27:38", updated_at: "2008-06-24
 14:27:38", rate: 3>

Abbiamo prima memorizzato l'istanza e poi abbiamo richiamato il metodo destroy; se proviamo ad eseguire la stessa istruzione viene segnalato un errore, poiché non esiste più un bookmark con id pari a 5:

>> b = Bookmark.find(5)
ActiveRecord::RecordNotFound: Couldn't find Bookmark with ID=5
        from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record
/base.rb:1379:in 'find_one'
        from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record
/base.rb:1362:in 'find_from_ids'
        from C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record
/base.rb:537:in 'find'
        from (irb):8

È possibile procedere alla cancellazione in massa di molti record con il metodo destroy_all. Questo metodo ci permette di cancellare tutti i record indistintamente oppure di eliminare quei record che verificano una determinata condizione; in questo ultimo caso è sufficiente indicare le condizioni desiderate come parametro. Ad esempio vediamo come eliminare tutti bookmark che hanno voto minore di 3:

>> Bookmark.destroy_all("rate < 3")

Se invece si conosce l'id del record che si vuole eliminare, è possibile specificare l'id come parametro:

>> Bookmark.destroy(5)

Oppure si può indicare un array contenente gli id di tutti i record che vogliamo eliminare:

>> Bookmark.destroy([1, 2, 5])

Ti consigliamo anche