Как отразить в базе данных новые отношения own_to и has_many в Ruby on Rails - PullRequest
23 голосов
/ 06 января 2011

Я новичок в rails (обычно это парень с питоном) и просто пытаюсь создать простое приложение для управления задачами для развлечения.Я использую Devise для аутентификации и у меня есть один объект Task, который я пытаюсь связать с пользователем.Я добавил следующее в модель Задачи:

class Task < ActiveRecord::Base
    belongs_to :user
end

и добавил в свою модель пользователя для Devise следующее:

class User < ActiveRecord::Base
   has_many :tasks

   <<normal Devise stuff>>
end

Всякий раз, когда я добавлял эту информацию, я запускал:грабли дб: мигрировать.Затем он выдал ошибку, что поле базы данных не существует для user_id, когда я попытался что-то с ним сделать.

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

Ответы [ 3 ]

39 голосов
/ 06 января 2011

Добавление отношения belongs_to (или любого другого) к вашей модели только говорит активной записи, что модели связаны логически.Это дает вам доступ к таким методам, как task.user.Чтобы это действительно работало, экземпляры должны быть связаны через поля базы данных.

Это пропущенный шаг: вам нужно создать миграцию, которая добавит столбец в таблицу задач, указывающий, к какому пользователю он принадлежитto.

rails g migration AddUserIdToTasks user_id:integer

Примечание. AddUserIdToTasks может быть любым именем, которое вы хотите.Это не имеет значения.Затем вы можете открыть db/migrations/add_user_to_tasks и посмотреть, что он делает.Обычно self.up изменяет базу данных так, как вы хотите, а self.down делает противоположное (поэтому в этом случае удаляет used_id).

Затем для фактического выполнения команд SQL для изменения таблицы базы данныхи схема, запустите

rake db:migrate
5 голосов
/ 06 января 2011

Вам нужно сгенерировать миграцию, чтобы сначала добавить внешний ключ:

rails g migration AddUserIdToTasks user_id:integer

Затем запустите db:migrate

И если вы хотите, чтобы пользователь мог ссылаться на ассоциацию как user.dreams, вам нужно добавить :class_name => 'Task' в строку has_many в модели User.

0 голосов
/ 06 января 2011

Ваш пользовательский класс кажется слишком мечтательным, чтобы позаботиться о его задачах.

has_many :dreams // should be probably
has_many :tasks

Предполагая, что в модели ваших задач есть поле user_id, то есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...