Каково поведение create join table of ActiveRecord::Migration?

я обнаружил хороший способ создания таблиц соединений для моих отношений HABTM в моем приложении Rails.

rails g migration CreateJoinTable table1 table2

журнал ActiveRecord::Migration, который использует метод create_join_table

мне интересно, что делает этот замечательный таинственный метод. Я думаю, это делает таблицу (вероятно, без id поле), который имеет столбец для внешнего ключа table1 и столбец для внешнего ключа table2, но имеет ли таблица какие-либо другие функции?. Моя привычка к join tables всегда была добавьте уникальный индекс в оба этих столбца, чтобы связь между записью в table1 и записью в table2 нельзя было ввести дважды.

мой вопрос сводится к: если я использую create_join_table мне нужно продолжать добавлять этот уникальный индекс, или этот метод делает это для меня (я думаю, что он должен)?

на документации я обычно смотрю на не вдается в такого рода детали.

3 ответов


вызывается без какого-либо блока,create_join_table просто создает таблицу с двумя внешними ключами, ссылающимися на две соединенные таблицы.

однако вы можете фактически передать блок при вызове метода для выполнения любых дополнительных операций (например, добавление индексов). С рельсов doc:

create_join_table :products, :categories do |t|
  t.index :product_id
  t.index :category_id
end

посмотреть create_join_table документация.

вы можете проверить create_join_table код внизу (нажмите на кнопку источник: шоу).


SchemaStatements#create_join_table () создает только таблицы без использования индексов и т. д... Поэтому, если вы хотите использовать ограничение уникальности для двух полей, вам нужно сделать что-то вроде этого:

class CreateJoinTable < ActiveRecord::Migration
  def change
    create_join_table :posts, :users do |t|
      t.integer :post_id, index: true
      t.integer :user_id, index: true
      t.index [:post_id, :user_id], name: 'post_user_un', unique: true
    end
  end
end

обратите внимание, что create_join_table по умолчанию не создает


оказывается, это не больше, чем основы, которые я описал в вопросе. Я обнаружил это, просто запустив миграцию и увидев, что заканчивается в db/schema.rb

для тех, кто заинтересован, чтобы сделать уникальный индекс этого:

class CreateJoinTable < ActiveRecord::Migration
  def change
    create_join_table :posts, :users
    add_index :posts_users, [:post_id, :user_id], unique: true, name: 'index_posts_users'
  end
end