Вам нужно добавить отдельную таблицу соединений только с restaurant_id
и user_id
(без первичного ключа) в алфавитном порядке .
Сначала запустите миграции, затем отредактируйте созданный файл миграции.
Рельсы 3
rails g migration create_restaurants_users_table
Рельсы 4 :
rails g migration create_restaurants_users
Рельсы 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Из документов :
Также существует генератор, который будет создавать таблицы соединения, если JoinTable является частью имени:
Ваш файл миграции (обратите внимание на :id => false
то, что препятствует созданию первичного ключа):
Рельсы 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
Рельсы 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
автоматически создаст необходимые индексы. def change
автоматически обнаружит прямую или обратную миграцию, нет необходимости в перемещении вверх / вниз.
Рельсы 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Примечание. Существует также опция для имени настраиваемой таблицы, которую можно передать в качестве параметра вызываемой create_join_table table_name
. Из документов
По умолчанию имя объединяемой таблицы происходит от объединения первых двух аргументов, предоставленных create_join_table, в алфавитном порядке. Чтобы настроить имя таблицы, укажите параметр: table_name:
restaurant_id
. Второй поможет, если вы ищетеuser_id
. Если вы ищете на обоих, я думаю, что база данных будет достаточно умной, чтобы нуждаться только в одном. Так что я думаю, что второй вариант действительно не нужно усложнять. Это был скорее просто пример. Однако это был вопрос Rails, поэтому публикация в разделе БД даст более полный ответ.rails g migration create_restaurants_users
без таблицы в конце.Ответы здесь довольно устаревшие. Начиная с Rails 4.0.2, ваши миграции используют файлы
create_join_table
.Чтобы создать миграцию, запустите:
Это сгенерирует следующее:
Если вы хотите проиндексировать эти столбцы, раскомментируйте соответствующие строки, и все готово!
источник
unique: true
к ней. Это предотвратит создание повторяющихся отношений.При создании объединенной таблицы обратите особое внимание на требование, чтобы две таблицы были перечислены в алфавитном порядке в имени / классе миграции. Это может легко вас укусить, если названия ваших моделей похожи, например, «abc» и «abb». Если бы вы бежали
Ваши отношения не будут складываться должным образом. Вы должны использовать
вместо.
источник
Для отношений HABTM вам необходимо создать таблицу соединений. Есть только таблица соединений, и в этой таблице не должно быть столбца id. Попробуйте эту миграцию.
Вы должны проверить это руководство по отношениям.
источник