Problema con has_many belongs_to

Hola a todos soy nuevo en Rails y estoy haciendo pruebas. Les comento mi
situacion:

Tengo a nivel de base de datos una tabla productos
(id,tip_id,descproducto,precio) y una tabla
tipo_productos(id,descripcion).
Entonces un producto pertenece a un tipo de producto y un tipo de
producto
tiene N productos.

Entonces en el modelo tengo

class Producto < ActiveRecord::Base
belongs_to :tipo_producto
end

class TipoProducto < ActiveRecord::Base
has_many :productos
end

Bueno creo que voy bien… cierto?
Ahora en la vista show de productos se muestra el id del tipo de
producto y
yo necesito ver es la descripcion del tipo de producto y no se como
hacerlo.

En el controller tengo:

def show
@producto = Producto.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @articulo }
end

end

No se como encontrar la descripcion del tipo de producto y mostrarlo…

Les notifico que yo se hacerlo con el find_by_sql(“select
a.*,b.descripcion
from productos a, tipo_productos b where a.tip_id = b.id”)
pero entonces oara que sirve colocar las relaciones has_many y
belongs_to en
las clases modelos respectivas?

A ver quien me da una luz!

Muchas Gracias

Manuel P. wrote:

Hola a todos soy nuevo en Rails y estoy haciendo pruebas. Les comento mi
situacion:

Tengo a nivel de base de datos una tabla productos
(id,tip_id,descproducto,precio) y una tabla
tipo_productos(id,descripcion).
Entonces un producto pertenece a un tipo de producto y un tipo de
producto
tiene N productos.

Entonces en el modelo tengo

class Producto < ActiveRecord::Base
belongs_to :tipo_producto
end

class TipoProducto < ActiveRecord::Base
has_many :productos
end

Bueno creo que voy bien… cierto?
Ahora en la vista show de productos se muestra el id del tipo de
producto y
yo necesito ver es la descripcion del tipo de producto y no se como
hacerlo.

En el controller tengo:

def show
@producto = Producto.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @articulo }
end

end

No se como encontrar la descripcion del tipo de producto y mostrarlo…

Les notifico que yo se hacerlo con el find_by_sql(“select
a.*,b.descripcion
from productos a, tipo_productos b where a.tip_id = b.id”)
pero entonces oara que sirve colocar las relaciones has_many y
belongs_to en
las clases modelos respectivas?

A ver quien me da una luz!

Muchas Gracias

Bueno, esto es muy sencillo:

def show
@producto = Producto.find(params[:id]) #tanto en @producto como en
params tienes el id
@descripcion = TipoProducto.find(@producto.id).descripcion #Así de
simple

respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @articulo }
end
end

Ahora tienes que ir a la vista y mostrar la variable @descripcion.

Espero haberte sido de ayuda ;).

Aún más fácil: con la relación definida correctamente, en la vista
puedes
hacer
for producto in @productos
producto.nombre

producto.tipo_producto.descripcion
end

Mírate bien las relaciones de Active Record ya que estas cosas son
básicas.

El día 12 de junio de 2008 21:13, Carlos Belizón <
[email protected]> escribió:

Emili Parreño wrote:

Aún más fácil: con la relación definida correctamente, en la vista
puedes
hacer
for producto in @productos
producto.nombre

producto.tipo_producto.descripcion
end

Mírate bien las relaciones de Active Record ya que estas cosas son
básicas.

El día 12 de junio de 2008 21:13, Carlos Belizón <
[email protected]> escribió:

Pero él está trabajando para mostrar un sólo artículo, no todos, así que
no sé si tu solución es correcta. ¿No?

Lo he puesto así porque es un caso típico de la vista index, si solo
quiere
ver la descripcion de un tipo de producto y tiene @producto, se puede
hacer
@producto.tipo_producto.descripcion

El día 12 de junio de 2008 23:59, Carlos Belizón <
[email protected]> escribió:

Emili Parreño wrote:

Lo he puesto así porque es un caso típico de la vista index, si solo
quiere
ver la descripcion de un tipo de producto y tiene @producto, se puede
hacer
@producto.tipo_producto.descripcion

El día 12 de junio de 2008 23:59, Carlos Belizón <
[email protected]> escribió:

Sigo sin verlo, producto pertenece a tipo_producto, y tipo_producto
puede tener varios productos, ¿Cómo va acceder de esa forma?

Según lo que decia Manuel:
class Producto < ActiveRecord::Base
belongs_to :tipo_producto
end

class TipoProducto < ActiveRecord::Base
has_many :productos
end

Entonces un producto tiene UN tipo de producto, por tanto producto
tendrá un
campo llamado tipo_producto_id que es una clave foránea para acceder al
tipo
de producto del producto. Luego:

1 producto tiene 1 tipo de producto (relación 1 a1)
1 tipo de producto tiene muchos productos (relación 1 a N)

Por tanto, si tenemos una variable de instancia de la clase producto,
podemos hacer:

@producto.tipo_producto.descripcion

Ya que el tipo de producto es unico para cada producto.

Esto es todo.

PD: Carlos, el código que tu pusiste de ejemplo está mal

def show
@producto = Producto.find(params[:id]) #tanto en @producto como en
params tienes el id
@descripcion = TipoProducto.find(@producto.id).descripcion #Así de
simple

Esto busca un tipo de producto que tenga el mismo ID que el producto

El día 13 de junio de 2008 13:19, Carlos Belizón <
[email protected]> escribió:

Emili Parreño wrote:

Esto busca un tipo de producto que tenga el mismo ID que el producto

El día 13 de junio de 2008 13:19, Carlos Belizón <
[email protected]> escribió:

Tienes razón, qué mal lo estaba haciendo yo en mi aplicación :S.

Manuel P. wrote:

Muchas gracias Emili me funciono perfectamente.
Gracias a ti también Carlos pero te informo que la solucion que me
suministraste la implemente y como dijo Emili esobusca un tipo de
producto
que tenga el mismo ID que el producto.

El día 13/06/08, Emili Parreño [email protected] escribió:

Hombre, teniendo en cuenta que el ID de tipo_producto ha de ser único,
tan mal no estaba la solución (pienso yo), lo que sí es que no usaba la
potencia de Rails.

Muchas gracias Emili me funciono perfectamente.
Gracias a ti tambien Carlos pero te informo que la solucion que me
suministraste la implemente y como dijo Emili esobusca un tipo de
producto
que tenga el mismo ID que el producto.

El día 13/06/08, Emili Parreño [email protected] escribió: