2011-01-06 2 views
23

Sono nuovo alle rotaie (di solito un tipo python) e ho appena provato a creare una semplice applicazione di gestione delle attività per divertimento. Sto usando Devise per l'autenticazione e ho un singolo oggetto Task che sto cercando di mettere in relazione con un utente. Ho aggiunto il seguente al modello Task:Come riflettere nel database una nuova parentesi_destinazione e has_many in Ruby on Rails

class Task < ActiveRecord::Base 
    belongs_to :user 
end 

e ho aggiunto il seguente nel mio modello utente per Devise:

class User < ActiveRecord::Base 
    has_many :tasks 

    <<normal Devise stuff>> 
end 

Ogni volta che ho aggiunto queste informazioni Allora ho fatto funzionare: rake db: migrate . Quindi mi ha dato un errore che il campo del database non esisteva per user_id quando ho provato a fare qualcosa con esso.

Sono sicuro che è qualcosa di piuttosto semplice che mi manca. Grazie per l'aiuto.

+0

Ci scusiamo per i sogni: confusione, aveva aggiunto qualcosa da un altro progetto accidentalmente. Dovrebbe essere risolto ora. –

risposta

39

L'aggiunta di una relazione belongs_to (o qualsiasi altra) al modello indica solo la registrazione attiva che i modelli sono collegati logicamente. Questo ti dà accesso a metodi come task.user. Perché ciò funzioni effettivamente, le istanze devono essere collegate tramite i campi del database.

Questo è il passaggio che ti manca: è necessario creare una migrazione che aggiungerà una colonna alla tabella Attività indicando a quale utente appartiene.

rails g migration AddUserIdToTasks user_id:integer 

Nota AddUserIdToTasks può essere il nome che si desidera. Non fa differenza. È quindi possibile aprire db/migrations/add_user_to_tasks e vedere cosa fa. Solitamente self.up modificherà il database come lo vuoi e self.down farà l'opposto (quindi, in questo caso, rimuovi the used_id).

Poi per eseguire effettivamente i comandi SQL per modificare la tabella di database e lo schema, eseguire

rake db:migrate 
+0

Ho fatto questo e mi è sembrato di aggiungerlo al database, grazie! Ora suppongo di aver bisogno di aggiungerlo al modello per popolare il valore e vedere se tutto funziona bene. –

+2

Dovresti essere in grado di creare/collegare le istanze del modulo nella console di rails con, ad esempio, task = Task.first; task.user = User.first; task.save –

5

è necessario generare una migrazione per aggiungere la chiave esterna prima:

rails g migration AddUserIdToTasks user_id:integer 

Quindi eseguire db:migrate

E se si desidera che l'utente sia in grado di fare riferimento l'associazione come user.dreams, è necessario aggiungi :class_name => 'Task' alla riga has_many nel modello Utente.

0

La classe utente sembra troppo sognante per occuparsi dei suoi compiti.

has_many :dreams // should be probably 
has_many :tasks 

Supponendo che il modello di attività abbia un campo id_utente, ovvero.