Каково поведение 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