Перенос Rails для таблицы join_and_belongs_to_many join

Как мне выполнить script/generate migration чтобы создать таблицу соединений для отношений has_and_belongs_to_many ?

Приложение работает на Rails 2.3.2, но у меня также установлен Rails 3.0.3.

    Где:

     class Teacher < ActiveRecord::Base has_and_belongs_to_many :students end 

    а также

     class Student < ActiveRecord::Base has_and_belongs_to_many :teachers end 

    для рельсов 4:

     rails generate migration CreateJoinTableStudentTeacher student teacher 

    для рельсов 3:

     rails generate migration students_teachers student_id:integer teacher_id:integer 

    для рельсов <3

     script/generate migration students_teachers student_id:integer teacher_id:integer 

    (обратите внимание, что в названии таблицы перечислены обе таблицы соединений в алфавитном порядке)

    а затем только для рельсов 3 и ниже, вам нужно отредактировать сгенерированную миграцию, так что поле id не будет создано:

     create_table :students_teachers, :id => false do |t| 

    Таблица has_and_belongs_to_many должна соответствовать этому формату. Я предполагаю, что к двум моделям присоединится has_and_belongs_to_many уже в БД: apples и oranges :

     create_table :apples_oranges, :id => false do |t| t.references :apple, :null => false t.references :orange, :null => false end # Adding the index can massively speed up join tables. Don't use the # unique if you allow duplicates. add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true) 

    Если вы используете :unique => true в индексе, то вы должны (в rails3) передать :uniq => true to has_and_belongs_to_many .

    Дополнительная информация: Rails Docs

    UPDATED 2010-12-13 Я обновил его, чтобы удалить идентификаторы и временные метки … В основном MattDiPasquale и nunopolonia верны: не должно быть идентификатора, и не должно быть временных меток или рельсов, которые не позволят has_and_belongs_to_many работать.

    Вы должны назвать таблицу именами двух моделей, которые вы хотите подключить, в алфавитном порядке и поместите два идентификатора модели в таблицу. Затем подключите каждую модель друг к другу, создав ассоциации в модели.

    Вот пример:

     # in migration def self.up create_table 'categories_products', :id => false do |t| t.column :category_id, :integer t.column :product_id, :integer end end # models/product.rb has_and_belongs_to_many :categories # models/category.rb has_and_belongs_to_many :products 

    Но это не очень гибко, и вы должны подумать об использовании has_many: через

    Верхний ответ показывает составной индекс, который, как я полагаю, не будет использоваться для поиска яблок из апельсинов.

     create_table :apples_oranges, :id => false do |t| t.references :apple, :null => false t.references :orange, :null => false end # Adding the index can massively speed up join tables. # This enforces uniqueness and speeds up apple->oranges lookups. add_index(:apples_oranges, [:apple_id, :orange_id], :unique => true) # This speeds up orange->apple lookups add_index(:apples_oranges, :orange_id) 

    Я нашел ответ на этот вопрос, основанный на «Докторе», который полезен и, конечно же, дискуссия.

    В рельсах 4 вы можете просто использовать

    create_join_table: table1s,: table2s

    это все.

    Осторожно: вы должны нарушать таблицу1, table2 с буквенно-цифровым.

    Мне нравится делать:

    rails g migration CreateJoinedTable model1:references model2:references . Таким образом, я получаю миграцию, которая выглядит так:

     class CreateJoinedTable < ActiveRecord::Migration def change create_table :joined_tables do |t| t.references :trip, index: true t.references :category, index: true end add_foreign_key :joined_tables, :trips add_foreign_key :joined_tables, :categories end end 

    Мне нравится иметь индекс в этих столбцах, потому что я часто буду выполнять поиск с использованием этих столбцов.

    Давайте будем гением компьютера.