Как отразить в базе данных новые отношения role_to и has_many в Ruby on Rails
Я новичок в рельсах (обычно это python guy) и просто пытался создать простое приложение для диспетчера задач для удовольствия. Я использую Devise для аутентификации и имею один объект Task, который я пытаюсь связать с пользователем. Я добавил в модель задачи следующее:
class Task < ActiveRecord::Base
belongs_to :user
end
и я добавил следующее в моей модели User для Devise:
class User < ActiveRecord::Base
has_many :tasks
<<normal Devise stuff>>
end
Всякий раз, когда я добавлял эту информацию, я запускал: rake db: migrate. Затем он дал мне ошибку, что поле базы данных не существовало для user_id, когда я пытался что-то с этим сделать.
Я уверен, что это нечто довольно простое, что мне не хватает. Спасибо за помощь.
Ответы
Ответ 1
Добавление отношения belongs_to
(или любого другого) к вашей модели говорит только активной записи о том, что модели связаны логически. Это дает вам доступ к таким методам, как task.user
. Чтобы это действительно работало, экземпляры должны быть связаны через поля базы данных.
Это тот шаг, который вам не хватает: вам нужно создать миграцию, которая добавит столбец в таблицу задач, указывающую, к какому пользователю он принадлежит.
rails g migration AddUserIdToTasks user_id:integer
Примечание. AddUserIdToTasks может быть любым именем, которое вы хотите. Это не имеет значения. Затем вы можете открыть db/migrations/add_user_to_tasks
и посмотреть, что он делает. Обычно self.up изменяет базу данных так, как вы ее хотите, а self.down будет делать обратное (так что в этом случае удалите used_id).
Затем, чтобы фактически выполнить команды SQL, чтобы изменить таблицу и схему базы данных, запустите
rake db:migrate
Ответ 2
Вам нужно сгенерировать миграцию, чтобы сначала добавить внешний ключ:
rails g migration AddUserIdToTasks user_id:integer
Затем запустите db:migrate
И если вы хотите, чтобы пользователь мог ссылаться на ассоциацию как user.dreams
, вам нужно добавить :class_name => 'Task'
в строку has_many в модели User.
Ответ 3
Ваш пользовательский класс кажется слишком мечтательным, чтобы заботиться о нем.
has_many :dreams // should be probably
has_many :tasks
Предполагая, что ваша модель задач имеет поле user_id, то есть.