2013-03-13 23 views
34

Ich frage mich, wie ich meinen Modellen Assoziationen hinzufügen kann. Nehmen wir an, ich erzeuge zwei ModelleFügen Sie Assoziationen zu vorhandenen Modellen hinzu

rails generate model User 
rails generate model Car 

Jetzt möchte ich eine Verbände hinzufügen, so dass die Modelle die Form

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

Die Frage erwerben ist: wie man sich bewirbt diese Änderung von Migrationen um cars_users zu erhalten Tabelle in der Datenbank? Ich plane, diese Tabelle in meinem Code zu verwenden.

+5

Sie haben keine Notwendigkeit für eine 'cars_users' Tabelle, da Sie Beziehung keine many-to-many haben. – Zippie

Antwort

55

belongs_to Verein erwartet eine association_id Spalte in es entsprechende Tabelle ist. Da Autos zu einem Benutzer gehören, sollte die Autos Tabelle eine user_id Spalte haben. Dies kann auf 2 Arten erreicht werden.

erste, können Sie die Spalte erzeugen, wenn Sie das Modell

rails g model car user_id:references 

oder fügen Sie die user_id erstellen, nachdem Sie das Modell wie Richard Brown Antwort erstellen. Seien Sie vorsichtig, wenn Sie integer anstelle von references verwenden, müssen Sie den Index selbst erstellen.

rails g migration add_user_id_to_cars user_id:integer 

dann in der Migration erzeugt, fügen

add_index :cars, :user_id 

UPDATE:

Als Joseph in den Kommentaren erwähnt hat, die Notwendigkeit, den Index manuell bereits in der aktuellen Version adressiert wurde hinzufügen von Schienen. Ich denke, es wurde in Rails 4 eingeführt. Sie können mehr davon in der official Rails guide for migrations lesen. Der Kern von ihm läuft die folgende Generator

bin/rails g migration add_user_to_cars user:references 

eine Migration mit einer Linie ähnlich wie

add_reference :cars, :user, index: true 

Dieses eine Tabelle user_id Spalte in die Autos hinzuzufügen erstellen und es wird zugleich die Spalte zu indiziert werden.

+0

nur Neugier: Was ist, wenn zwischen den Modellen gab es has_and_belongs_to_many Assoziation. Wer wäre dann für die Erstellung von cars_users table verantwortlich? Ich, Ruby on Rails oder jemand anderes? – Andrew

+3

Sie. hattm join-Tabellen brauchen keine Klasse, benötigen aber trotzdem die Tabelle und müssen dafür eine Migration erstellen :) – jvnill

+2

Anstatt dies in zwei Schritten zu tun, können Sie Referenzen nach der Modellerstellung hinzufügen: 'rails g migration addUserReferencesToCars user : Referenzen'. Dies sorgt dafür, dass 'user_id' zu' cars' hinzugefügt wird und es auf einmal zu einem Index wird. – Joseph

7

eine Migration generieren, um den Verband zu erstellen:

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

Nach @ jvnill Erklärung in Schienen 4 (und vielleicht auch in Schienen 3.2 auch) Sie können es tun, wie dies auch (die id Teile zu vermeiden und die genaue convetions Erinnerung):

rails g migration AddUserToCar user:references 

Welche schaffen die nach der Migration, sowohl Hinzufügen der Spalte und Index mit allen richtigen Konventionen kümmern:

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

Am Ende wie immer die Migration ausgeführt wird:

rake db:migrate 

Zeigen Sie Ihre schema.rb an, um die neue Index- und user_id-Spalte anzuzeigen.

0

Migration Datei:

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 
Verwandte Themen