Principiante

Hola q tal amigos !
Estoy empezando a entrar en el mundo de rails, y tengo una duda con
respecto a como mapear las relaciones de unas tablas de una BD. Por
ej:
Tengo mis tablas alumnos y materias, y el alumno tiene una materia asi:

  • Tabla Alumnos (id, nombre, apellido, id_materia, …) id_materia
    es clave foranea de la tabla Materias.
  • Tabla Materias (id, nombreMateria, obs, …)

En mis modelos tengo lo siguiente.
en alumno tengo “belongs_to :materia”
y en materia “has_many :alumno”

Hasta ahi todo ok.
Pero luego cuando quiero por ejemplo listar todos los alumnos con su
materia…hago esto:
<%= alumno.materia.nombreMateria %>
Esto me da un error, me dice q materia es nil…

Ahh y en mi controlador de alumno:
def lista
@alumnos = Alumnos.find_all
end

Cual es mi error ???

Saludos…

On 8/10/07, Santiago Y. [email protected] wrote:

Hola q tal amigos !
Estoy empezando a entrar en el mundo de rails, y tengo una duda con
respecto a como mapear las relaciones de unas tablas de una BD. Por
ej:
Tengo mis tablas alumnos y materias, y el alumno tiene una materia asi:

  • Tabla Alumnos (id, nombre, apellido, id_materia, …) id_materia
    es clave foranea de la tabla Materias.

Usando la convencion seria: materia_id
Igualmente en este caso supongo que tu relacion seria de muchos a
muchos, por lo cual se crea una tabla intermedia alumnos_materias con
alumno_id y materias_id igual para este tema busca informacion sobre
has_and_belongs_to_many, mirate la api de Active Record. [1]

  • Tabla Materias (id, nombreMateria, obs, …)

Yo te diria que nombreMateria es nombre nomas, porque si esta en la
tabla materias esta asentado que es parte del objeto Materia, y es
mucho mas feliz escribir materia.nombre que materia.nombreMateria.

En mis modelos tengo lo siguiente.
en alumno tengo “belongs_to :materia”
y en materia “has_many :alumno”

has_many :alumnos

Las relaciones de este tipo estan pluralizada y con mucho sentido, vos
decis “tiene muchos alumnos” y no “tiene muchos alumno”.

end

Cual es mi error ???

Estas definiendo una variable de instancia que tiene un array de
alumnos, supongo que la variable local alumno de vista es de una
iteracion de @alumnos, el problema probablemente sea que no tienen
materia asignada.

Igual es todo un tema para explicar, lo mejor seria que investigues y
leas sobre el Active Record y el manejo de relaciones, si tenes acceso
al “Agile Development with Ruby on Rails” es un gran libro y trata
bien el tema este.

Y una vez mas, te recomiendo leer [1].

Salu!

[1] ActiveRecord::Base

Ahh y en mi controlador de alumno:
def lista
@alumnos = Alumnos.find_all
end

Además, debiera ser Alumno.find_all; el nombre de las clases de
ActiveRecord
va en singular

Saludos

Juan Ignacio Pumarino