In den Rails 3- Dokumenten wird die build
Methode für Zuordnungen als dieselbe wie die new
Methode beschrieben, jedoch mit der automatischen Zuweisung des Fremdschlüssels. Direkt aus den Dokumenten:
Firm#clients.build (similar to Client.new("firm_id" => id))
Ich habe anderswo ähnlich gelesen.
Allerdings, wenn ich verwende new
(zB some_firm.clients.new
ohne Parameter), die der neuen Client - firm_id
Verband wird automatisch erstellt. Ich starre gerade auf die Ergebnisse in der Konsole!
Vermisse ich etwas Sind die Dokumente etwas veraltet (unwahrscheinlich)? Was ist der Unterschied zwischen build
und new
?
ruby-on-rails
ruby-on-rails-3
associations
ClosureCowboy
quelle
quelle
Antworten:
Sie lesen die Dokumente leicht falsch.
some_firm.client.new
ein neues schafftClient
Objekt aus der Kunden - Sammlung, und so kann er automatisch die eingestelltefirm_id
zusome_firm.id
, während die Dokumente fordern ,Client.new
die überhaupt keine Kenntnis von Firm - ID hat, so ist es , die Bedürfnissefirm_id
an sie übergeben.Der einzige Unterschied zwischen
some_firm.clients.new
undsome_firm.clients.build
scheint darin zu bestehen, dassbuild
der neu erstellte Client auch zurclients
Sammlung hinzugefügt wird:Wenn Sie ein Objekt über eine Zuordnung
build
erstellen , sollten Sie es vorziehen,new
da der Build Ihr In-Memory-Objektsome_firm
(in diesem Fall) in einem konsistenten Zustand hält, noch bevor Objekte in der Datenbank gespeichert wurden.quelle
some_firm.client.new
fügt auch den Clientsome_firm.clients
und ruftsave
aufsome_firm
in einem Validierungsfehler führte darauf hinweist , dassclient
war ungültig. Wenn beidesnew
undbuild
der neue Client zursome_firm
Client-Sammlung hinzugefügt wird , was machtbuild
dasnew
nicht? Es tut mir leid, dass ich hier dicht bin!build
ist nur ein Alias fürnew
:Den vollständigen Code finden Sie unter: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74
quelle
alias build new
ab Schienen 3.2.13build
undbuild_#{association}
. Sehen Sie hier und hier .Rails 4
?Sie haben Recht, der Build und die neuen Funktionen haben den gleichen Effekt wie das Festlegen des Fremdschlüssels, wenn sie über eine Zuordnung aufgerufen werden. Ich glaube, der Grund, warum die Dokumentation so geschrieben ist, besteht darin, zu verdeutlichen, dass ein neues Client-Objekt instanziiert wird, im Gegensatz zu einer neuen aktiven Datensatzbeziehung. Dies ist der gleiche Effekt, den das Aufrufen von .new für eine Klasse in Ruby haben würde. Das heißt, in der Dokumentation wird klargestellt, dass das Aufrufen von Build für eine Zuordnung dasselbe ist, indem ein neues Objekt erstellt wird (Aufruf von .new) und die Fremdschlüssel an dieses Objekt übergeben werden. Diese Befehle sind alle gleichwertig:
Ich glaube, der Grund, warum .build existiert, ist, dass Firm.first.clients.new so interpretiert werden kann, dass Sie ein neues has_many-Beziehungsobjekt anstelle eines tatsächlichen Clients erstellen. Der Aufruf von .build ist daher eine Möglichkeit, dies zu klären.
quelle
build
vsnew
:z.B:
für neue:
Zum Bauen:
Hier werden Clients im Speicher gespeichert, wenn sie sicher gespeichert werden, werden auch zugehörige Datensätze gespeichert.
quelle
Model.new
Tag.new post_id: 1
instanziiert ein Tag mit seinempost_id
Set.@ model.models.new
@post.tags.build
macht dasselbe UND das instanziierte Tag wird@post.tags
noch vor dem Speichern angezeigt .Dies bedeutet
@post.save
, dass sowohl das @post als auch das neu erstellte Tag gespeichert werden (vorausgesetzt: inverse_of ist gesetzt). Dies ist großartig, da Rails beide Objekte vor dem Speichern validiert und keines gespeichert wird, wenn eines von beiden die Validierung nicht besteht.models.new vs models.build
@post.tags.build
und@post.tags.new
sind gleichwertig (zumindest seit Rails 3.2).quelle
The only difference between some_firm.clients.new and some_firm.clients.build seems to be that build also adds the newly-created client to the clients collection:
?