la méthode build sur ruby on rails
De nouveaux rails et je suis la suite du Dépôt du projet trouve dans la méthode Agile de développement web avec des rails 3.1. Tout allait bien jusqu'à ce que je me suis perdu quand le livre utilisé la "construction" de la méthode.
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)
Mes recherches sur google m'a amené à comprendre que l' .la méthode build est juste une manière plus propre de créer une ligne dans la table d'association entre les tables). Mais sur le code ci-dessus, je m'attendais à ce que le code devrait ressembler à quelque chose comme ceci:
@line_item = @cart.line_items.build(product_id => params[:product_id])
Je ne comprends pas pourquoi l'auteur avait pour stocker l'ensemble de la ligne de produits( produit = Produit.find(params[:product_id])) au lieu de simplement obtenir le product_id...
Est-il plus que ce que je peux comprendre?
Vous devez vous connecter pour publier un commentaire.
Vous avez mal compris
build
. C'est juste un alias denew
, rien de spécial. https://github.com/rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84build
de ne pas "créer" un enregistrement dans la base de données, il suffit de créer un nouvel objet dans la mémoire de sorte que la vue peut prendre cet objet et afficher quelque chose, surtout pour un formulaire.Pour votre deuxième question, oui, votre manière de composer par id fonctionnera aussi bien. Mais une meilleure approche est de ne pas faire confiance param. Au lieu de cela, vérifier en trouver en db au premier abord.
ActiveRecord::Relation#build
est un alias deActiveRecord::Relation#new
, maisActiveRecord::Associations::CollectionProxy#new
est un alias deActiveRecord::Associations::CollectionProxy#build
(sens inverse). Avec une association,build
/new
va créer le nouveau dossier avec l'id de l'enregistrement de la place. Donc, la Relation#construire et la Relation#new légèrement différentes implémentations de CollectionProxy#construire et CollectionProxy#new. Cependant, puisqu'ils sont des alias dans les deux classes, alors qu'il n'a pas d'importance si vous utilisezbuild
ounew
.Je vais aller de l'avant et de dire que vous êtes tout à fait correct. Quelle que soit la méthode fonctionne et vais faire la même chose, mais votre version en utilisant simplement
:product_id
est plus efficace et nécessite moins requête de base de données. Cela dit, il pourrait être utile si vous avez besoin queproduct
variable plus tard dans le code ou que spécifique appelsproduct.{something}
plus tard afin de ne pas avoir à le chercher par id à ce point.Cependant, personnellement, je préfère tout simplement définir le
:product_id
, je ne vois aucune raison de trouver l'objet premier.