Создание ограничений внешнего ключа в ActiveRecord

Как создать внешние ключи в ActiveRecord? У меня в моделях есть что-то вроде:

class Student < ActiveRecord::Base
  attr_accessible :name, :level_id
  belongs_to :level
end

class Level < ActiveRecord::Base
  attr_accessible :number
  has_many :students
end

Но база данных schema.rb и development sqlite3 не имеет никаких указаний, связанных с ограничениями внешнего ключа с полем level_id. Это что-то, что я должен делать вручную, кроме ActiveRecord или Rails? Я пропустил шаг?

Использование Rails 3.2.8

Ответ 1

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

Перенос Rails не создает помощников поставщика для создания внешних ключей. Вы можете создать свой собственный SQL для ограничения в миграции или использовать Инопланетный камень. Иностранец предоставит вспомогательные методы для создания ограничений при миграции:

add_foreign_key(:students, :levels)

Ответ 2

Если у вас есть rails >= 4.2 и с помощью адаптера mysql, mysql2 или postgresql, вы можете использовать метод add_foreign_key в своем переносе следующим образом:

# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors

Справочник по API

Ответ 3

Добавление строк belong_to и has_many к вашим моделям делает Rails осведомленным об их отношении и генерирует вспомогательные методы, но не создает FK на уровне базы данных. Для этого вам необходимо создать и запустить миграцию:

rails g migration add_level_id_to_students level_id:integer

то   rake db: migrate

Если вы хотите сгенерировать модель с частью внешнего ключа, вы можете использовать ярлык references: rails g model Student name:string level:references

Ознакомьтесь с Rails guide для получения дополнительной информации!

Ответ 4

   $ rails generate migration AddStudentRefToLevels student:references

который должен сделать что-то вроде этого

class AddStudentRefToLevels < ActiveRecord::Migration
  def change
    add_reference :levels, :student, index: true
  end
end

взято здесь http://guides.rubyonrails.org/migrations.html#creating-a-migration