Musisz dodać oddzielną tabelę łączenia zawierającą tylko restaurant_id
i user_id
(bez klucza podstawowego), w kolejności alfabetycznej .
Najpierw uruchom migracje, a następnie edytuj wygenerowany plik migracji.
Szyny 3
rails g migration create_restaurants_users_table
Szyny 4 :
rails g migration create_restaurants_users
Szyny 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Z dokumentów :
Istnieje również generator, który utworzy tabele złączeń, jeśli JoinTable jest częścią nazwy:
Twój plik migracji (zwróć uwagę na :id => false
; to jest to, co zapobiega utworzeniu klucza podstawowego):
Szyny 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
Szyny 4
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
automatycznie utworzy niezbędne indeksy. def change
automatycznie wykryje migrację do przodu lub do tyłu, bez potrzeby wykonywania operacji w górę / w dół.
Szyny 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Uwaga: istnieje również opcja niestandardowej nazwy tabeli, którą można przekazać jako parametr do create_join_table o nazwie table_name
. Z dokumentów
Domyślnie nazwa tabeli łączenia pochodzi z sumy pierwszych dwóch argumentów podanych do create_join_table, w porządku alfabetycznym. Aby dostosować nazwę tabeli, podaj opcję: nazwa_tabeli:
restaurant_id
. Drugi pomoże, jeśli szukasz dalejuser_id
. Jeśli szukasz w obu, myślę, że baza danych byłaby wystarczająco inteligentna, aby potrzebować tylko jednej. Więc myślę, że drugi nie musi być tak naprawdę złożony. To był raczej przykład. Było to jednak pytanie Railsów, więc publikowanie w sekcji DB dałoby pełniejszą odpowiedź.rails g migration create_restaurants_users
bez stołu .Odpowiedzi tutaj są dość przestarzałe. Począwszy od Rails 4.0.2, Twoje migracje wykorzystują
create_join_table
.Aby utworzyć migrację, uruchom:
Spowoduje to wygenerowanie:
Jeśli chcesz zindeksować te kolumny, odkomentuj odpowiednie wiersze i gotowe!
źródło
unique: true
do niej. Zapobiegnie to tworzeniu zduplikowanych relacji.Podczas tworzenia tabeli łączenia należy zwrócić szczególną uwagę na wymaganie, aby dwie tabele były wymienione w kolejności alfabetycznej w nazwie / klasie migracji. Może to łatwo Cię ugryźć, jeśli nazwy modeli są podobne, np. „Abc” i „abb”. Gdybyś miał uciekać
Twoje relacje nie będą działać zgodnie z oczekiwaniami. Musisz użyć
zamiast.
źródło
W przypadku relacji HABTM musisz utworzyć tabelę łączenia. Jest tylko tabela złączeń i ta tabela nie powinna mieć kolumny id. Spróbuj tej migracji.
Musisz sprawdzić samouczki przewodnika po szynach relacji
źródło