46

Przeglądałem wiele postów SO i google w celu wygenerowania migracji tabeli dołączania dla skojarzenia has many and belongs to many i nic nie działa.Wygeneruj migrację - utwórz tabelę łączenia

Wszystkie rozwiązania generują pusty plik migracyjny.

Używam rails 3.2.13 i mam dwie tabele: security_users i assignments. Oto kilka rzeczy, które wypróbowałem:

rails generate migration assignments_security_users 

rails generate migration create_assignments_security_users 

rails generate migration create_assignments_security_users_join_table 

rails g migration create_join_table :products, :categories (following the official documentation) 

rails generate migration security_users_assignments security_user:belongs_to assignments:belongs_to 

Czy ktoś może powiedzieć, jak utworzyć migrację sprzężenia między tabelami?

Odpowiedz

33

Run to polecenie, aby wygenerować pusty plik migracji (nie jest wypełniane automatycznie, trzeba go wypełnić sam):

rails generate migration assignments_security_users 

Otwórz wygenerowany plik migracji i dodać ten kod:

class AssignmentsSecurityUsers < ActiveRecord::Migration 
    def change 
    create_table :assignments_security_users, :id => false do |t| 
     t.integer :assignment_id 
     t.integer :security_user_id 
    end 
    end 
end 

Następnie uruchom rake db:migrate z terminala. Stworzyłem a quiz on many_to_many relationships z prostym przykładem, który może ci pomóc.

+2

Jeśli robisz to w ten sposób, upewnij się, że dodajesz '' 'null: false''' do definicji pól. Na przykład: '' 't.integer: assignment_id, null: false''''. Chroni to przed upiornymi sytuacjami, w których kończy się tabela złączenia nigdzie wskazująca, twoje dane tracą integralność, a twój kod przewraca się. (Lub kończy się na brzydkim i brzydkim systemie alarmowym). –

+0

Zgadzam się z @Powers i dodam, że być może warto dodać indeks do tych kolumn? – BKSpurgeon

115

Aby wypełnione automatycznie na create_join_table polecenie w wierszu poleceń powinien wyglądać następująco:

rails g migration CreateJoinTableProductsSuppliers products suppliers 

dla modelu produktu i modelu dostawcy. Railsy utworzą tabelę zatytułowaną "products_suppliers". Zwróć uwagę na pluralizację.

(uwaga Side że komenda generation można skrócić do zaledwie g)

+42

Aby tabele wspólne wyglądały bardziej znacząco: 'rails g migration CreateJoinTableProductsSuppliers product supplier'' – zishe

+7

Należy zachować ostrożność podczas korzystania z CreateJoinTable, ponieważ podczas pracy z tabelami z prefiksem, takim jak my_products i my_suppliers, wygeneruje ona tabelę dołączeń, tak jak to my_products_my_suppliers, podczas gdy ActiveRecord oczekuje, że be my_products_suppliers. Wtedy skojarzenia takie jak MyProduct.first.my_suppliers nie będą działały! Sprawdź https://github.com/rails/rails/issues/13683 - Moje rozwiązanie polegało na używaniu CreateJoinTable, ale dodawam 'table_name:: my_products_suppliers' w migracji http://guides.rubyonrails.org/migrations.html –

+0

@ andrewcockerham to nie działało w szynach 3.2 –

11

zazwyczaj lubią mieć „model” pliku, jak również, gdy tworzę tabelę dołączyć. Dlatego też.

rails g model AssignmentSecurityUser assignments_security:references user:references 
Powiązane problemy