(no subject)

Holas
Tengo la siguiente duda que no tengo muy claro como resolver.
Tengo 3 modelos: photos, comentarios y usuarios.

class Photo < ActiveRecord::Base
belongs_to :usuarios
has_many :comments

class Comment < ActiveRecord::Base
has_one :usuarios
has_one :photos

class Usuario < ActiveRecord::Base
has_many :photos
has_many :comments

Para cada photo hay comentarios introducidos por usuarios.
Cada comentario tiene un usario_id que apunta a usuarios…

Aqui vienen mis dudas
Muestro las fotos y los comentarios, pero a la ahora de mostrar el
avatar de los usuarios es cuando tengo el problema no se si es que no
tengo las relaciones correctamente hechas.
Os pongo un trozo de codigo

http://127.0.0.1:3000/photos/show/2

#el controlador

@photo = Photo.find(:first, :order => ‘rand()’)
@[email protected]

Hasta aqui todo correcto, encuentro la foto y los comentarios, pero
tambien me gustaria poder mostrar el avatar de la gente que escribio
el comentario… he probado diversas combinaciones pero siempre me da
error.

Alguien sabe como se mostraria el avatar ( que esta en la tabla
usuarios)?

Muchas gracias por vuestra atencion

@cp.each do |comment|
comment.user.avatar
end

Siendo el bucle en el que muestras los comentarios y el
comment.user.avatar lo que vayas a hacer con el avatar.

Un saludo,

Serabe

Gracias por responde, pero no funciona…:frowning:

He puesto en la vista el bucle, intento acceder al modelo usuario,
pero no me acaba de funcionar…es como si la relacion no estuviera
correctamente

comment.usuario.avatar

undefined method `usuario’

Los métodos belongs_to y has_one van seguidos por el modelo en singular:

belongs_to :usuario
has_one :usuario
has_one :photo

Prueba esto primero y luego nos cuentas.

Salu2,

Javier

El 27/08/07, trancos asd [email protected]
escribió:> Gracias por responde, pero no funciona…:frowning:

On 27/08/07, trancos asd [email protected] wrote:

Gracias por responde, pero no funciona…:frowning:

He puesto en la vista el bucle, intento acceder al modelo usuario,
pero no me acaba de funcionar…es como si la relacion no estuviera
correctamente

comment.usuario.avatar

undefined method `usuario’

En esto que has puesto

class Comment < ActiveRecord::Base
has_one :usuarios

‘usuario’ es uno (has_one) así que debe ir en singular


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

On 27/08/07, trancos asd [email protected] wrote:

Lo maximo que he conseguido es que me genere una sentencia de sql erronea:
Mysql::Error: Unknown column ‘usuarios.comment_id’ in ‘where clause’:
SELECT * FROM usuarios WHERE (usuarios.comment_id = 3) LIMIT 1

Os pego de nuevo las relaciones y las tablas a ver si a alguien se le
ocurre donde esta el error…

Hombre, no hace falta que “se nos ocurra”, está escrito ahí :slight_smile: Dice
que la tabla ‘usuario’ no tiene comment_id y efectivamente, no lo
tiene. Así que el error no tiene misterio.

class Usuario < ActiveRecord::Base
has_many :photos
has_many :comments

Si el usuario has_one :photo, entonces la :photo belongs_to :usuario,
y ya no se esperará una columna comment_id en usuario, sino una
columna user_id en comment.

Por cierto, yo no mezclaría nombres de modelo en castellano y en
inglés, puede llevarte a confusión. De hecho, yo no usaría castellano.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

Hola
He probado a ponerlo en singular tal y como comentas (de hecho lo
tenia puesto asi incialmente, aunque lo cambie pq empece a probar
cosas), pero tampoco funciona…

Lo maximo que he conseguido es que me genere una sentencia de sql
erronea:
Mysql::Error: Unknown column ‘usuarios.comment_id’ in ‘where clause’:
SELECT * FROM usuarios WHERE (usuarios.comment_id = 3) LIMIT 1

Os pego de nuevo las relaciones y las tablas a ver si a alguien se le
ocurre donde esta el error…

| usuarios | CREATE TABLE usuarios (
id int(11) NOT NULL auto_increment,
login varchar(255) default NULL,
email varchar(255) default NULL,
crypted_password varchar(40) default NULL,
salt varchar(40) default NULL,
created_at datetime default NULL,
updated_at datetime default NULL,
remember_token varchar(255) default NULL,
remember_token_expires_at datetime default NULL,
PRIMARY KEY (id)
)

| photos | CREATE TABLE photos (
id int(11) NOT NULL auto_increment,
filename varchar(255) default NULL,
created_at datetime default NULL,
thumbnail varchar(255) default NULL,
descritpion varchar(255) default NULL,
votos int(11) default NULL,
nota float default NULL,
PRIMARY KEY (id)
)

| comments | CREATE TABLE comments (
id int(11) NOT NULL auto_increment,
photo_id int(11) default NULL,
usuario_id int(11) default NULL,
body varchar(255) default NULL,
created_at datetime default NULL,
updated_at datetime default NULL,
PRIMARY KEY (id)
)

Aqui las relaciones…

class Photo < ActiveRecord::Base
belongs_to :usuario
has_many :comments

class Comment < ActiveRecord::Base
has_one :usuario
has_one :photo

class Usuario < ActiveRecord::Base
has_many :photos
has_many :comments

Gracias por la ayuda

Hola Manuel

Si el usuario has_one :photo, entonces la :photo belongs_to :usuario,
y ya no se esperará una columna comment_id en usuario, sino una
columna user_id en comment.

Acabo de dejar los modelos tal como tu dices…

En photos_controller

def show

@[email protected]
end

En la vista: show.rhtml (muestro la imagen con los comentarios)

<% for comment in @cp %>

<%= comment.usuario_id %> <%= comment.body %> <% end %>

Pero cualquier intento de acceder a la tabla usuario, tanto en el
controlador como en la vista, produce un error…

Gracias por la ayuda

Hola jaime

Mira algun cosa que he probado (llamandolo desde la vista)

En photos_controller

def show

@[email protected]
end

En la vista: show.rhtml
<% for comment in @cp %>


<%= comment.usuarios.login %>
<%= comment.body %>

<% end %>

undefined method `usuarios’ for #Comment:0xb6fca2f4

O poniendolo en el controlador:

def show

@[email protected]
@[email protected]
end

undefined method `usuario’ for Comment:Class

Y asi con cualquier combinacion que he probado…

Trancos 123 wrote:

Pero cualquier intento de acceder a la tabla usuario, tanto en el
controlador como en la vista, produce un error…

Y cuál es el mensaje de error ?

Saludos.

Jaime Mora R.

Trancos 123 wrote:

undefined method `usuario’ for Comment:Class

Utiliza :include en el find, para que te incluya los objetos asociados
del modelo cuando realize la consulta a la base de datos :

@photo = Photo.find(params[:id], :include => [:comments, :usuario])

Espero te sirva.

Saludos

Jaime Mora R.

On 8/27/07, trancos asd [email protected] wrote:

En la vista: show.rhtml
<% for comment in @cp %>

<%= comment.usuarios.login %>
<%= comment.body %>

<% end %>

undefined method `usuarios’ for #Comment:0xb6fca2f4

la clase Comment, belongs_to :usuario. Nada de “usuarios” o has_one.
Luego usas comment.usuario.

Al margen de eso, deberías usar un include en el find, como te dicen
en otro correo.

On 28/08/07, trancos asd [email protected] wrote:

Mysql::Error: Unknown column ‘usuarios.comment_id’ in ‘where clause’:
SELECT * FROM usuarios WHERE (usuarios.comment_id = 4) LIMIT 1

Parece que sigues teniendo a los usuarios como pertenencientes a
comentarios, en vez de al
revés
Tiene que estar así

usuario has_many :comments
comment belongs_to :usuario

Y la columna usuario_id en la tabla comments


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

Hola,

creo que este pdf te aclarará las cosas

está muy bien explicado.

Warlock-G
La Serena
Chile

trancos asd
escribió:> Primero de todo muchas gracis por vuestra paciencia.

Primero de todo muchas gracis por vuestra paciencia.

Utilice el include como me indico jaime .

Tengo los modelos tal como me dijo Manuel:
“Si el usuario has_one :photo, entonces la :photo belongs_to :usuario,
y ya no se esperará una columna comment_id en usuario, sino una
columna user_id en comment.”

Pero aun asi me da un error :

<%= comment.usuario.login %>

Mysql::Error: Unknown column ‘usuarios.comment_id’ in ‘where clause’:
SELECT * FROM usuarios WHERE (usuarios.comment_id = 4) LIMIT 1

On 8/28/07, Manuel González Noriega [email protected]
wrote:

Y la columna usuario_id en la tabla comments

Si!!!
Funciona! pufff, ha costado… jejejejej

Muchas gracias por vuestra ayuda.