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])