46

Я просмотрел множество сообщений SO и google сообщений для генерации миграции таблицы соединений для ассоциации has many and belongs to many и ничего не работает.Создать миграцию - создать таблицу соединений

Все решения генерируют пустой файл миграции.

Я использую rails 3.2.13 и у меня есть две таблицы: security_users и assignments. Вот некоторые из вещей, которые я постарался:

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 

Может ли кто-нибудь сказать, как создать миграцию таблицы соединений между двумя таблицами?

ответ

33

Выполнить эту команду, чтобы создать пустой файл миграции (не заполняется автоматически, то вам необходимо заполнить его самостоятельно):

rails generate migration assignments_security_users 

Откройте созданный файл миграции и добавьте этот код:

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 

Затем запустите rake db:migrate с вашего терминала. Я создал a quiz on many_to_many relationships с простым примером, который может вам помочь.

+2

Если вы делаете это так, убедитесь, что вы добавили '' 'null: false''' в определения полей. Например: '' t.integer: assign_id, null: false'''. Это защитит от ужасных ситуаций, когда в итоге вы получите таблицу соединений, нигде не указывающую, ваши данные теряют целостность и ваш код падает. (Или заканчивается пронизанным уродливым и опасным кодом). –

+0

Я согласен с @Powers и добавлю, что, возможно, это идея добавить индекс в эти столбцы? – BKSpurgeon

115

Чтобы в create_join_table заполняются автоматически в командной строке, он должен выглядеть следующим образом:

rails g migration CreateJoinTableProductsSuppliers products suppliers 

Для модели продукта и модели поставщика. Rails создаст таблицу под названием «products_suppliers». Обратите внимание на плюрализацию.

(Примечание стороны, что generation команда может быть сокращена до всего g)

+42

Чтобы сделать совместные таблицы более значимыми: 'rails g migration CreateJoinTableProductsSuppliers product supplier' – zishe

+7

Будьте осторожны при использовании CreateJoinTable, потому что при работе с таблицами с префиксом, подобным my_products и my_suppliers, он будет генерировать таблицу соединений, такую ​​как my_products_my_suppliers, в то время как ActiveRecord ожидает ее быть my_products_suppliers. Тогда ассоциации, подобные MyProduct.first.my_suppliers, не будут работать! Проверьте https://github.com/rails/rails/issues/13683. Мое решение состояло в том, чтобы продолжать использовать CreateJoinTable, но добавьте 'table_name:: my_products_suppliers' в перенаправление http://guides.rubyonrails.org/migrations.html –

+0

@ andrewcockerham это не работало в рельсах 3.2 –

11

я обычно есть файл «модель», а когда я создаю таблицу присоединиться. Поэтому я и делаю.

rails g model AssignmentSecurityUser assignments_security:references user:references 
Смежные вопросы