Wann werden Active Record-Objekte in has_many-Beziehungen gespeichert?
Ich verwende Rails 1.2.3 (ja, ich weiß) und bin verwirrt darüber, wiehas_many
arbeitet in Bezug auf Objektpersistenz.
Zum Beispiel werde ich dies als meine Deklaration verwenden:
class User < ActiveRecord::Base
has_many :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :user
end
So wie ich es verstehe, generiert dies unter anderem eine MethodeUser#assignments.build
, wodurch einAssignment
Objekt dessenuser_id
ist die empfangende Instanzid
(und deren andere Felder wie im Argument angegeben sind), speichert dieses Objekt jedoch nicht in der Datenbank. Das Objekt kann später durch Aufruf gespeichert werdenAssignment#save!
.
Die Pragmatischen ProgrammiererAgile Webentwicklung mit Rails, 2. Auflage, die ich als Tutorial und Referenz verwendet habe, sagt:
Wenn das übergeordnete Objekt in der Datenbank vorhanden ist, wird es beim Hinzufügen eines untergeordneten Objekts zu einer Sammlung automatisch gespeichert.
Hier scheint es einen Widerspruch zu geben. Was ich gerne wissen würde, ist:
Wenn ich machesome_user.assignments.build
, ist derAssignment
Objekt gespeichert?Wenn ich machesome_user.assignments << Assignment.new
, ist derAssignment
Objekt gespeichert?Wenn ich machesome_user.assignments << Assignment.create
, werden zwei Datenbankaufrufe durchgeführt oder nur einer? Was ist, wenn ich das ändere?Assignment
Objekt zwischen dem Erstellen und Hinzufügensome_user.assignments
?Was passiert wenn ichsave!
einAssignment
Objekt, dessen entsprechendeUser
wurde noch nicht in der Datenbank gespeichert?P.S. Den Grund benutze ich nicht nurUser#assignments.create
Denn alles liegt daran, dass ich die Initialisierung nicht auf eine externe Methode auslagern kann, was ich gerne tun würde. Ich möchte auch nicht mehrere Fahrten in die Datenbank machen.