ruby-on-rails - software - ruby on rails website
método de construcción en rubí sobre rieles (2)
Has entendido mal la build
. Es solo un alias de new
, nada especial. https://github.com/rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84
build
no "creará" un registro en la base de datos, solo creará un nuevo objeto en la memoria para que la vista pueda tomar este objeto y mostrar algo, especialmente para un formulario.
Para su segunda pregunta, sí, su forma de componer por id también funcionará. Pero un mejor enfoque es no confiar en param. En su lugar, verifíquelo encontrando en db al principio.
Nuevo en Rails y estoy siguiendo el proyecto Depot que se encuentra en el desarrollo web Agile con Rails 3.1. Todo estuvo bien hasta que me perdí cuando el libro utilizó el método de "construcción".
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)
Mis búsquedas en Google me llevaron a comprender que el método .build es solo una forma más limpia de crear una fila en la tabla (con asociación entre tablas). Pero en el código anterior, esperaba que el código se pareciera a algo como esto:
@line_item = @cart.line_items.build(product_id => params[:product_id])
No entiendo por qué el autor tuvo que almacenar toda la fila de productos (product = Product.find (params [: product_id])) en lugar de obtener el product_id ...
¿Hay más de lo que puedo entender?
Voy a seguir adelante y decir que está completamente en lo cierto. Cualquiera de los dos métodos funciona y hará lo mismo, pero su versión usando solo :product_id
es más eficiente y requiere una consulta de base de datos menos. Dicho esto, podría tener sentido si necesita esa variable de product
más adelante en el código o esa línea de pedido específica llama product.{something}
más tarde para que no tenga que buscarla por id en ese momento.
Sin embargo, personalmente preferiría simplemente establecer :product_id
, no veo ninguna razón para encontrar el objeto primero.