2011-01-06 9 views
23

Soy nuevo en rails (generalmente un tipo pitón) y acabo de intentar crear una sencilla aplicación administrador de tareas para divertirme. Estoy usando Devise para autenticación y tengo un único objeto Task que intento relacionar con un usuario. He añadido lo siguiente para el modelo de tareas:Cómo reflejar en la base de datos una nueva relación belongs_to y has_many en Ruby on Rails

class Task < ActiveRecord::Base 
    belongs_to :user 
end 

y he añadido lo siguiente en mi modelo de usuario para Diseñar:

class User < ActiveRecord::Base 
    has_many :tasks 

    <<normal Devise stuff>> 
end 

Siempre he añadido esta información a continuación, me encontré: rake db: migrate . Luego me dio un error que el campo de la base de datos no existía para user_id cuando intenté hacer algo con él.

Estoy seguro de que es algo bastante simple que me falta. Gracias por la ayuda.

+0

Lo siento por los sueños: confusión, habían añadido algo de otro proyecto de forma accidental. Debería ser arreglado ahora. –

Respuesta

39

Agregar una relación belongs_to (o cualquier otra) a su modelo solo le dice al registro activo que los modelos están vinculados lógicamente. Esto le da acceso a métodos como task.user. Para que esto realmente funcione, las instancias deben estar vinculadas mediante campos de base de datos.

Este es el paso que falta: debe crear una migración que agregará una columna a la tabla de tareas que indica a qué usuario pertenece.

rails g migration AddUserIdToTasks user_id:integer 

Nota AddUserIdToTasks puede ser el nombre que desee. No hace ninguna diferencia. A continuación, puede abrir db/migrations/add_user_to_tasks y ver qué hace. Usualmente self.up modificará la base de datos como lo desee y self.down hará lo contrario (por lo tanto, en este caso, elimine el used_id).

A continuación, para ejecutar realmente los comandos SQL para modificar la tabla de base de datos y el esquema, ejecute

rake db:migrate 
+0

Lo hice y pareció agregarlo a la base de datos, ¡gracias! Ahora supongo que necesito agregarlo a la plantilla para llenar realmente el valor y ver si todo funciona bien. –

+2

Debería poder crear/vincular las instancias de su módulo en la consola de rails con, por ejemplo, task = Task.first; task.user = User.first; task.save –

5

que necesita para generar una migración añadir la clave externa en primer lugar:

rails g migration AddUserIdToTasks user_id:integer 

A continuación, ejecute db:migrate

Y si desea que el usuario sea capaz de hacer referencia a la asociación como user.dreams, es necesario agregue :class_name => 'Task' a la línea has_many en el modelo de Usuario.

0

Su clase de usuario parece ser demasiado soñadora para encargarse de sus tareas.

has_many :dreams // should be probably 
has_many :tasks 

Suponiendo que el modelo de tareas tiene un campo user_id, es decir.

Cuestiones relacionadas