10.5 Erstellen, bearbeiten und löschen 

Wenn Sie ein neues ActiveRecord-Objekt erzeugen, haben Sie die Wahl, ob es zunächst nur im Speicher angelegt (new) oder direkt in der Datenbank gespeichert werden soll (create).
Neues ActiveRecord-Objekt erstellen 

Es gibt mehrere Möglichkeiten, ein neues Objekt anzulegen:
client = Client.new client.firstname = "William" client.lastname = "Adama" client.save
Alternativ kann auch ein Block verwendet werden:
Client.new do |client| client.firstname = "William" client.lastname = "Adama" end.save
Die kürzeste Variante ist die folgende:
client = Client.new(:firstname => "Willam", :lastname => "Adama") client.save
save
Die Methode save liefert true zurück, wenn das Objekt erfolgreich gespeichert werden konnte, ansonsten false . Ein Grund, warum ein Objekt nicht gespeichert werden kann, ist die Verletzung von Validierungsregeln, falls diese definiert wurden. Wenn man keine Abfrage auf den Rückgabewert der Methode save durchführt, kann es passieren, dass man es nicht bemerkt, wenn ein Objekt nicht gespeichert werden konnte.
Die Methode save! hingegen erzeugt einen Laufzeitfehler. Somit kann ein Fehlschlagen des Speichervorgangs nicht so leicht übersehen werden.
ActiveRecord-Objekt erstellen und direkt speichern 

Mit der Methode create wird ein Objekt erstellt und automatisch gespeichert, ohne dass explizit die Methode save oder save! aufgerufen wird.
Auch hier unterstützt ActiveRecord mehrere Varianten:
Client.create do |c| c.firstname = "William" c.lastname = "Adama" end
Oder in der Kurzvariante:
Client.create(:firstname => "William", :lastname => "Adama")
In beiden Fällen ist der Rückgabewert das gespeicherte ActiveRecord-Objekt. Das heißt, Sie können auch client1 = Client.create(...) schreiben. Falls das Objekt z. B. wegen einer nicht erfüllten Validierungsregel nicht gespeichert werden kann, wird das ungespeicherte Objekt zurückgeliefert. Die Methode create! führt hingegen zu einem Laufzeitfehler, falls das Objekt nicht gespeichert werden kann.
Aktualisieren von Objekten 

Der einfachste Weg, ein Objekt zu verändern, ist, ein Attribut zu setzen und das Objekt anschließend wieder zu speichern:
client = Client.find(1) client.firstname = "Lee" client.save
update_attribute
Alternativ kann auch die Methode update_attribute verwendet werden, die keinen Aufruf der save -Methode benötigt:
client = Client.find(1) client.update_attribute(:firstname,"Lee")
update_attributes
Um mehrere Attribute zu aktualisieren, können Sie die Methode update_attributes verwenden:
client = Client.find(1) client.update_attributes(:firstname => "Kara", :lastname => "Trace")
Aktualisieren von Model-Daten im Controller |
Die Methode
update_attributes wird oft in Controllern in der Action
update eingesetzt, um Daten eines bestimmten Datensatzes zu ändern. Für das Formular zum Ändern eines Client-Objekts stehen zum Beispiel die Formulareingaben des Benutzers im Controller über
params[:client] zur Verfügung. Mit nur zwei Befehlen ist dann das Aktualisieren dieses Objekts im Controller möglich:
@client = Client.find(params[:id]) @client.update_attributes(params[:client]) |
update
Mit Hilfe der Methode update, die jedem ActiveRecord-Model zur Verfügung steht, geht es sogar noch kürzer:
Client.update(1,:firstname => "Kara", :lastname => "Trace")
Löschen von Objekten 

destroy
Sie können entweder ein einzelnes Objekt löschen, indem Sie die Methode destroy auf ein vorhandenes Objekt anwenden, oder mehrere Datensätze löschen, indem Sie die Methoden delete oder destroy auf die Model-Klasse anwenden.
client = Client.find(1) client.destroy
Die Methode destroy löscht zwar den entsprechenden Datensatz in der Datenbanktabelle, das Objekt client ist aber noch vorhanden, das heißt, es kann weiterhin verwendet werden. Allerdings können die Attribute nicht mehr verändert werden, das heißt, sie sind »eingefroren«. Ein Versuch, ein Attribut zu ändern, führt zu einem Laufzeitfehler:
client = Client.find(1) client.destroy client.firstname = "Lee" => TypeError: can't modify frozen hash
freeze
Die Methode frozen? kann verwendet werden, um zu überprüfen, ob ein Objekt verändert werden kann. Mit der Methode freeze können Sie ein Objekt explizit einfrieren.
Sie können auch Datensätze löschen, ohne die Objekte vorher laden zu müssen. Dazu existieren zu jedem ActiveRecord-Model die Klassen-Methoden destroy und delete.
Löschen eines Datensatzes mit der Angabe der ID:
Client.destroy(1)
oder auch durch Angabe einer Liste von IDs:
Client.destroy([1,4,6])
delete
Die Methode delete unterscheidet sich von der Methode destroy dadurch, dass die Before- und After-filter nicht ausgeführt werden.
Um mehrere oder alle Datensätze einer Tabelle zu löschen, können Sie die Methode destroy_all oder delete_all verwenden.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.