Создание ограничений внешнего ключа в 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
Ответ 5
Теперь это встроено в Rails, вам не нужен Иностранец. См. Раздел 3.6 Внешние ключи здесь: http://edgeguides.rubyonrails.org/active_record_migrations.html