4.6 - Aggiorniamo i modelli già esistenti

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


L’aggiornamento dei modelli è un’operazione abbastanza semplice. I metodi principali esposti dal componente ActiveRecord sono due: save (API) e update_attributes (API).

Il primo metodo è esattamente lo stesso visto nel paragrafo riguardante l’aggiunta di un nuovo record. Il suo comportamento è però influenzato dalla presenza o meno dell’attributo id: se presente verrà eseguito un’aggiornamento del modello, altrimenti un’aggiunta di un nuovo record su database.

new_team = Team.new (:name => "Fiorentina", :owner => "Della Valle", :balance => 9999)
new_team.save
existing_team = Team.find_by_name("Fiorentina")
existing_team.owner = "Andrea Della Valle" 
existing_team.save

Deleghiamo a Rails la scelta tra l’inserimento o l’aggiornamento: noi ci dobbiamo semplicemente preoccupare degli attributi da modificare.

Oltre a questo metodo abbiamo a disposizione anche il metodo d’istanza update_attributes. Esso permette di cambiare attributi e salvare l’oggetto in un’unica chiamata. Riprendiamo l’esempio di prima:

new_team = Team.new (:name => "Fiorentina", :owner => "Della Valle", :balance => 9999)
new_team.save
existing_team = Team.find_by_name("Fiorentina")
existing_team.update_attributes(:owner => "Andrea Della Valle")

Entrambi i metodi presentano una variante distruttiva (quindi preceduta dal punto esclamativo !) che a differenza dei precedenti (che ritornano un boolean) sollevano un’eccezione in caso di insuccesso.

Un ultima lancia va spezzata a favore di due metodi che possono ritornare utili in alcune precise circostanze.

Se volessimo modificare un’oggetto senza istanziarlo in memoria prima di modificarlo, potremmo usare il metodo di classe update (API) passandogli come parametro l’id dell’oggetto e le nuove proprietà:

updated_team = Team.update(1, :name => "AC Milan")

Se la nostra necessità è quella di modificare svariati modelli, possiamo usare il metodo di classe update_all (API) che necessita di due parametri: la stringa sql rappresentante la modifica da effettuare e gli attributi dei record da aggiornare:

# diminuiamo alle squadre più ricche il bilancio
Team.update_all("balance = balance - 100", "balance > 10000")

Tutto semplice no?

Guida RoR

4.5 – Otteniamo i record dal database

4.7 – Eliminazione dei modelli

Updated on July 09, 2008 17:59 by Ruby Fan (84.223.21.115)