2016-09-29 2 views
4

Если вы это имели в Rails 4:Почему Rails 5 изменил «индекс» на «внешний ключ»?

t.references :event, index: true 

Теперь вы можете использовать foreign_key вместо index в Rails 5. Я не совсем понимаю, почему они решили сделать это, так как функциональность остается такой же, какая вы добавляете INDEX, а не FOREIGN KEY к этому столбцу.

+3

Я честно Дон Не понимаю ваш вопрос, опция index добавляет базу данных i ndex, внешний ключ добавляет внешний ключ базы данных. –

ответ

15

В Rails 5 - при обращении к модели автоматически создается индекс на foreign_key.

API перенос изменился в Rails 5 -

Rails 5 изменили миграционную API из-за которого даже если null: false опция не передаются метки времени при миграции выполняется, то не нуль автоматически добавляется для временных меток.

Аналогичным образом, мы хотим индексировать столбцы с ссылками практически во всех случаях. Поэтому Rails 5 не нуждается в ссылках, чтобы иметь index: true. Когда миграция выполняется, индекс автоматически создается.

В качестве примера - (Копирование с http://blog.bigbinary.com/2016/03/01/migrations-are-versioned-in-rails-5.html)

При запуске rails g model Task user:references

Rails 4 будет генерировать

class CreateTasks < ActiveRecord::Migration 
    def change 
    create_table :tasks do |t| 
     t.references :user, index: true, foreign_key: true 
     t.timestamps null: false 
    end 
    end 
end 

И рельсы 5 будет генерировать

class CreateTasks < ActiveRecord::Migration[5.0] 
    def change 
    create_table :tasks do |t| 
     t.references :user, foreign_key: true 
     t.timestamps 
    end 
    end 
end 
+0

Очень хорошо подробный ответ. НО, что, если по какой-то причине я не хочу, чтобы ссылка была проиндексирована? Или он по-прежнему индексировался неявно в Rails 4, даже если у меня есть только 't.references: user, foreign_key: true'? --- И теперь, я удивляюсь, почему они даже не пропустили 'foreign_key: true' тоже. –

4

foreign_key и index - это совершенно разные вещи (как вы можете судить по их именам).

Так что ничего не меняется, вы все равно можете использовать два.

Для получения дополнительной информации об установлении ассоциаций в миграциях вы можете узнать these docs.

Смежные вопросы