Подтвердить что ты не робот

Как отразить в базе данных новые отношения 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, когда я пытался что-то с этим сделать.

Я уверен, что это нечто довольно простое, что мне не хватает. Спасибо за помощь.

4b9b3361

Ответ 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, то есть.