126 votes

Construire de nouveautés Rails 3 vs

Dans les Rails 3 docs, l' build méthode pour les associations, est décrit comme étant le même que l' new méthode, mais avec l'affectation automatique de la clé étrangère. Directement à partir de la documentation:

Firm#clients.build (similar to Client.new("firm_id" => id))

J'ai lu de semblable ailleurs.

Cependant, lorsque j'utilise new (par exemple, some_firm.clients.new sans paramètres), le nouveau client, l' firm_id association est créée automatiquement. Je regarde les résultats en ce moment dans la console!

Ai-je raté quelque chose? Sont les docs un peu à l'écart de date (peu probable)? Quelle est la différence entre build et new?

209voto

henrym Points 1516

Vous êtes à la lecture de la documentation légèrement. some_firm.client.new est la création d'un nouveau Client objet de la part des clients de la collection, et il peut donc définir automatiquement l' firm_id de some_firm.id, alors que les docs sont en appelant Client.new qui n'a aucune connaissance de toute Entreprise de l'id, c'est pourquoi elle a besoin de l' firm_id passée.

La seule différence entre some_firm.clients.new et some_firm.clients.build semble être qu' build ajoute également de la création du nouveau client à l' clients collection:

henrym:~/testapp$ rails c
Le chargement de l'environnement de développement (Rails 3.0.4)
r:001 > (some_firm = Ferme.de nouvelles).enregistrer # Créer et enregistrer une nouvelle Entreprise
 => true 
r:002 > some_firm.les clients # Pas de clients encore
 => [] 
r:003 > some_firm.clients.nouveau # Créer un nouveau client
 => #<Client id: néant, firm_id: 1, created_at: néant, updated_at: néant> > 
r:004 > some_firm.les clients # Toujours pas de clients
 => [] 
r:005 > some_firm.clients.build # Créer un nouveau client de construire avec
 => #<Client id: néant, firm_id: 1, created_at: néant, updated_at: néant> > 
r:006 > some_firm.les clients # Nouveau client est ajoutée aux clients 
 => [#<Client id: néant, firm_id: 1, created_at: néant, updated_at: néant>>] 
r:007 > some_firm.enregistrer
 => true 
r:008 > some_firm.les clients # Économie d'entreprise enregistre également le client
 => [#<Client id: 1, firm_id: 1, created_at: "2011-02-11 00:18:47",
updated_at: "2011-02-11 00:18:47">] 

Si vous êtes à la création d'un objet à travers une association, build doit être préférée à l' new construire maintient votre objet en mémoire, some_firm (dans ce cas) dans un état cohérent même avant tous les objets ont été enregistrées dans la base de données.

94voto

Hatem Mahmoud Points 351

« construction » est simplement un alias pour les « nouveaux » :

Vérifier son code ici : https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb

11voto

Pan Thomakos Points 19946

Vous avez raison, la construire et de nouvelles fonctions ont le même effet de la définition de la clé étrangère, lorsqu'ils sont appelés par le biais d'une association. Je crois que la raison pour laquelle la documentation est écrite comme ceci est à préciser qu'un nouveau Client de l'objet est instancié, par opposition à un nouveau record de la relation. C'est le même effet que l'appel .de nouveau sur une classe aurait en Ruby. C'est-à-dire que la documentation est à préciser que l'appel de s'appuyer sur une association est le même, est la création d'un nouvel objet (l'appel .de nouvelles) et en passant les clés étrangères à l'objet. Ces commandes sont toutes équivalentes:

Firm.first.clients.build
Firm.first.clients.new
Client.new(:firm_id => Firm.first.id)

Je crois que la raison .construire existe, c'est que la Firme.d'abord.clients.la nouvelle pourrait être interprétée comme signifiant que vous êtes la création d'une nouvelle has_many objet de relation, plutôt qu'un client, afin de l'appelant .construire est un moyen de clarifier cela.

4voto

sarwan Points 9

construire vs nouvelles essentiellement nouveau et de construire sont identiques, mais seulement la différence pour les dossiers,

par exemple. pour les nouveaux : Client.new(:firm_id=>Firm.first.id) de construction : Firm.first.clients.build lorsque nous sauver Firm.first.save, puis le client est également enregistré.

2voto

tybro0103 Points 13198

De modèle.nouveau

Tag.new post_id: 1 instancier une Balise avec ses post_id ensemble.

@modèle.modèles.nouveau

@post.tags.build fait la même chose ET la instancié Tag sera en @post.tags même avant de le sauvegarder.

Cela signifie @post.save permettra d'économiser à la fois l' @poste et la nouvelle construction de la balise (en supposant que :inverse_of est réglé). C'est grand parce que les Rails de valider à la fois les objets avant de les enregistrer, et l'un ne sera enregistrée si l'un d'entre eux l'échec de la validation.

modèles.nouveau vs modèles.construire

@post.tags.build et @post.tags.new sont équivalentes (au moins depuis les Rails 3.2).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X