2011-01-06 8 views
23

Jestem nowy dla rails (zazwyczaj python) i właśnie próbowałem zbudować prostą aplikację menedżera zadań dla zabawy. Używam Devise do uwierzytelniania i mam pojedynczy obiekt Task, który próbuję powiązać z użytkownikiem. Dodałem następujące do modelu Zadanie:Jak odzwierciedlić w bazie danych nową właściwość belongs_to i has_many w Ruby on Rails

class Task < ActiveRecord::Base 
    belongs_to :user 
end 

i dodałem następujące w moim modelu użytkownika dla opracować:

class User < ActiveRecord::Base 
    has_many :tasks 

    <<normal Devise stuff>> 
end 

Ilekroć dodaje tę informację Potem wybiegł: rake db: migrować . Dało mi to błąd, że pole bazy danych nie istnieje dla user_id, gdy próbowałem coś z nim zrobić.

Jestem pewien, że jest to coś bardzo prostego, czego mi brakuje. Dzięki za pomoc.

+0

przepraszam za zamieszanie: sny, dodał coś od innego projektu przypadkowo. To powinno być teraz naprawione. –

Odpowiedz

39

Dodawanie relacji belongs_to (lub dowolnej innej) do modelu informuje aktywny rekord, że modele są połączone logicznie. Daje to dostęp do metod takich jak task.user. Aby to faktycznie zadziałało, instancje muszą być połączone za pośrednictwem pól bazy danych.

To jest krok, którego ci brakuje: musisz utworzyć migrację, która doda kolumnę do tabeli zadań, wskazując, do którego użytkownika należy.

rails g migration AddUserIdToTasks user_id:integer 

Uwaga: AddUserIdToTasks może być dowolną nazwą. To nie robi różnicy. Możesz następnie otworzyć db/migrations/add_user_to_tasks i zobaczyć, co robi. Zwykle self.up zmodyfikuje bazę danych tak, jak chcesz, a self.down zrobi coś odwrotnego (więc w tym przypadku usuń used_id).

Wtedy faktycznie wykonywać polecenia SQL zmienić tabeli bazy danych i schematu, uruchom

rake db:migrate 
+0

Zrobiłem to i wydawało się, że dodałem je do bazy danych, dziękuję! Teraz myślę, że muszę dodać go do szablonu, aby faktycznie wypełnić wartość i sprawdzić, czy wszystko gra ładnie. –

+2

Powinieneś być w stanie tworzyć/łączyć instancje modułów w konsoli szyn za pomocą np. Task = Task.first; task.user = User.first; task.save –

5

Trzeba wygenerować migrację najpierw dodać klucz obcy:

rails g migration AddUserIdToTasks user_id:integer 

Następnie uruchom db:migrate

A jeśli chcesz, aby użytkownik, aby móc odwołać stowarzyszenie jako user.dreams, trzeba dodaj :class_name => 'Task' do linii has_many w Modelu użytkownika.

0

Twoja klasa użytkowników wydaje się być zbyt rozmarzona, aby zadbać o jej zadania.

has_many :dreams // should be probably 
has_many :tasks 

Zakładając, że model zadań ma pole user_id, to znaczy.

Powiązane problemy