2013-03-13 6 views
34

Mi chiedo come aggiungere associazioni ai miei modelli. Supponiamo, genero due modelliaggiungere associazioni ai modelli esistenti

rails generate model User 
rails generate model Car 

Ora voglio aggiungere una delle associazioni in modo che i modelli acquistano forma

class User < ActiveRecord::Base 
    has_many :cars 
end 
class Car < ActiveRecord::Base 
    belongs_to :user 
end 

La domanda è: come applicare questa modifica da migrazioni al fine di ottenere cars_users tabella nel database? Sto pensando di usare quella tabella nel mio codice.

+5

non avete bisogno di un tavolo 'cars_users' in quanto non si dispone di una relazione molti-a-molti. – Zippie

risposta

55

belongs_to associazione aspettarsi una colonna association_id nella sua tabella corrispondente. Poiché le auto appartengono all'utente, la tabella delle macchine deve avere una colonna user_id. Questo può essere realizzato in 2 modi.

prima, è possibile generare la colonna quando si crea il modello

rails g model car user_id:references 

o semplicemente aggiunge l'user_id dopo aver creato il modello come la risposta di Richard Brown. Fai attenzione che se usi integer invece di references, dovresti creare tu stesso l'indice.

rails g migration add_user_id_to_cars user_id:integer 

poi nella migrazione generato, aggiungere

add_index :cars, :user_id 

UPDATE:

Come Joseph ha detto nei commenti, la necessità di aggiungere l'indice manualmente è già stato affrontato nella versione attuale di Rails. Penso che sia stato introdotto in Rails 4. Puoi leggerne altre nello official Rails guide for migrations. L'essenza di esso esegue il seguente generatore

bin/rails g migration add_user_to_cars user:references 

creerà una migrazione con una linea simile a

add_reference :cars, :user, index: true 

Questo aggiunge una colonna user_id alla tabella autoveicoli e sarà anche contrassegnare quel colonna essere indicizzato

+0

solo curiosità: e se tra i modelli ci fossero has_and_belongs_to_many association. Chi sarebbe quindi responsabile della creazione del tavolo cars_users? Io, Ruby on Rails o qualcun altro? – Andrew

+3

tu. tabelle di join habtm non hanno bisogno di una classe, ma hanno ancora bisogno della tabella ed è necessario creare una migrazione per quello :) – jvnill

+2

Invece di fare questo in due passaggi, è possibile aggiungere riferimenti dopo la creazione del modello in questo modo: 'rails g migrazione addUserReferencesToCars user : references'. Questo si occupa di aggiungere 'user_id' a' cars' e renderlo un indice in un colpo solo. – Joseph

7

generare una migrazione per creare l'associazione:

rails g migration AddUserIdToCars user_id:integer 
rake db:migrate 
15

seguito @ spiegazione di jvnill in rotaie 4 (e forse in rotaie 3.2 troppo) si può fare così anche questo (evitando le parti id e ricordando le convetions esatte):

rails g migration AddUserToCar user:references 

che creerà la seguente migrazione, curando sia aggiungendo la colonna e indice con tutte le convenzioni corrette:

class AddUserToCar < ActiveRecord::Migration 
    def change 
    add_reference :cars, :user, index: true 
    end 
end 

alla fine come eseguire sempre la migrazione:

rake db:migrate 

Visualizza il tuo schema.rb per visualizzare il nuovo indice e la colonna user_id.

0

file di migrazione:

class Createuser < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
    end 

    create_table :cars do |t| 
     t.belongs_to :user, index: true 
     t.varchar(255) :model 
     t.varchar(255) :color 
    end 
    end 
end