Dans les rails 3 docs , la build
méthode des associations est décrit comme étant la même que la new
méthode, mais avec l'affectation automatique de la clé étrangère. Directement depuis la documentation:
Firm#clients.build (similar to Client.new("firm_id" => id))
J'ai lu la même chose ailleurs.
Cependant, lorsque j'utilise new
(par exemple some_firm.clients.new
sans aucun paramètre), l' firm_id
association du nouveau client est automatiquement créée. Je regarde les résultats maintenant dans la console!
Est-ce que je manque quelque chose? Les documents sont-ils un peu dépassés (peu probable)? Quelle est la différence entre build
et new
?
ruby-on-rails
ruby-on-rails-3
associations
FermetureCowboy
la source
la source
Réponses:
Vous lisez légèrement la documentation.
some_firm.client.new
crée un nouvelClient
objet à partir de la collection clients, et il peut donc automatiquement définir lefirm_id
sursome_firm.id
, alors que les documents appellentClient.new
qui n'ont aucune connaissance de l'identifiant de l'entreprise, il doit donc lui êtrefirm_id
transmis.La seule différence entre
some_firm.clients.new
etsome_firm.clients.build
semble être quebuild
ajoute également le client nouvellement créé à laclients
collection:Si vous créez un objet via une association,
build
doit être préféré ànew
la construction, car la construction conserve votre objet en mémoiresome_firm
(dans ce cas) dans un état cohérent avant même que les objets aient été enregistrés dans la base de données.la source
some_firm.client.new
ajoute également le client àsome_firm.clients
, et l'appelsave
sursome_firm
entraîne une erreur de validation indiquant qu'ilclient
n'est pas valide. Si les deuxnew
etbuild
ajoutez le nouveau client àsome_firm
la collection de clients de, qu'est-build
ce quenew
cela ne fait pas? Je suis désolé d'être dense, ici!build
est juste un alias pournew
:Le code complet peut être trouvé: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L74
la source
alias build new
à partir de rails 3.2.13build
etbuild_#{association}
. Voir ici et ici .Rails 4
?Vous avez raison, les fonctions build et new ont le même effet de définir la clé étrangère, lorsqu'elles sont appelées via une association. Je pense que la raison pour laquelle la documentation est écrite comme ceci est de clarifier qu'un nouvel objet Client est en cours d'instanciation, par opposition à une nouvelle relation d'enregistrement active. C'est le même effet que l'appel de .new sur une classe aurait dans Ruby. C'est-à-dire que la documentation précise que l'appel de build sur une association est la même chose que la création d'un nouvel objet (appelant .new) et la transmission des clés étrangères à cet objet. Ces commandes sont toutes équivalentes:
Je crois que la raison pour laquelle .build existe est que Firm.first.clients.new pourrait être interprété comme signifiant que vous créez un nouvel objet de relation has_many, plutôt qu'un client réel, donc appeler .build est un moyen de clarifier cela.
la source
build
vsnew
:par exemple:
pour les nouveaux:
Pour construire:
Ici, les clients sont stockés en mémoire, lors de la sauvegarde de l'entreprise, les enregistrements associés sont également enregistrés.
la source
Model.new
Tag.new post_id: 1
instanciera une balise avec sonpost_id
ensemble.@ model.models.new
@post.tags.build
fait de même ET la balise instanciée se trouvera@post.tags
avant même qu'elle ne soit enregistrée.Cela signifie
@post.save
sauvera à la fois le @post et la balise nouvellement construite (en supposant que inverse_of est défini). C'est génial car Rails validera les deux objets avant de les enregistrer, et aucun ne sera enregistré si l'un d'eux échoue à la validation.models.new vs models.build
@post.tags.build
et@post.tags.new
sont équivalents (au moins depuis Rails 3.2).la source
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:
?