2013-03-13 12 views
34

Zastanawiam się, w jaki sposób mogę dodać skojarzenia do moich modeli. Załóżmy, że generują dwa modeledodaj powiązania z istniejącymi modelami

rails generate model User 
rails generate model Car 

Teraz chcę dodać skojarzenia tak, że modele nabyć postaci

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

Pytanie brzmi: jak zastosować tę modyfikację przez migracje w celu uzyskania cars_users tabela w bazie danych? Planuję użyć tej tabeli w moim kodzie.

+5

nie masz potrzebę 'cars_users' tabeli, ponieważ nie ma wiele do wielu relacji. – Zippie

Odpowiedz

55

belongs_to stowarzyszenie oczekiwać kolumnę association_id w to odpowiedni stół. Ponieważ samochody należą do użytkownika, tabela samochodów powinna mieć kolumnę user_id. Można to osiągnąć na dwa sposoby.

pierwsze, można wygenerować kolumny podczas tworzenia modelu

rails g model car user_id:references 

lub po prostu dodać user_id po utworzeniu modelu podobnego odpowiedź Richarda Browna. Pamiętaj, że jeśli używasz integer zamiast references, musisz sam utworzyć indeks.

rails g migration add_user_id_to_cars user_id:integer 

następnie w wygenerowanym migracji dodać

add_index :cars, :user_id 

UPDATE:

Jak Józef wspomniał w komentarzach, trzeba dodać indeks ręcznie zostało już uwzględnione w aktualnej wersji Rails. Myślę, że został wprowadzony w Railsach 4. Możesz przeczytać więcej tego w official Rails guide for migrations. Istotą jest uruchomiony następujący generator

bin/rails g migration add_user_to_cars user:references 

stworzy migrację z linii podobnej do

add_reference :cars, :user, index: true 

To doda kolumnę user_id do stołu samochodów i będzie to również oznaczać, że kolumnę być indeksowane.

+0

tylko ciekawostka: co jeśli między modelami było skojarzenie has_and_belongs_to_many. Kto byłby wówczas odpowiedzialny za stworzenie tabeli cars_users? Ja, Ruby on Rails lub ktoś inny? – Andrew

+3

ty. tabele sprzężenia habtm nie potrzebują klasy, ale nadal potrzebują tabeli i musisz utworzyć dla niej migrację :) – jvnill

+2

Zamiast robić to w dwóch krokach, możesz dodać referencje po utworzeniu modelu, tak jak to: 'rails g migration addUserReferencesToCars user : referencje ". Dba o dodanie 'user_id' do' cars' i uczynienie go indeksem w jednym ujęciu. – Joseph

7

Generowanie migracji, aby utworzyć stowarzyszenie:

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

Po @ wyjaśnienia jvnill w szynach 4 (a może w szynach 3.2 też) można zrobić to w ten sposób zbyt (unikając części identyfikatora i pamiętając dokładnie convetions):

rails g migration AddUserToCar user:references 

co stworzy następujące migracje, dbając zarówno dodając indeks kolumny i ze wszystkimi poprawnymi umowami:

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

na koniec jak zawsze uruchomić migracji:

rake db:migrate 

Wyświetl swoją schema.rb, aby wyświetlić nowy indeks i kolumnę user_id.

0

plik Migracja:

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 
Powiązane problemy