Я запутался в том, как создать модель, принадлежащую другой модели. Моя книга использует этот синтаксис, чтобы связать Micropost с пользователем:
rails generate model Micropost user_id:integer
но http://guides.rubyonrails.org/ говорит сделать это так:
rails generate model Micropost user:references
Миграции, порожденные этими двумя, различны. Кроме того, для первых, как rails узнает, что user_id
это ссылка на внешний ключ user
? Спасибо!
источник
Сам Rails не знает, что
user_id
это ссылка на внешний ключuser
. В первой командеrails generate model Micropost user_id:integer
он только добавляет столбец,user_id
однако rails не знает, как использовать col. Вам нужно вручную поставить линию вMicropost
моделиключевые слова
belongs_to
иhas_many
определяют отношения между этими моделями и объявляютuser_id
в качестве внешнего ключа дляUser
модели.Более поздняя команда
rails generate model Micropost user:references
добавляет строкуbelongs_to :user
вMicropost
модель и тем самым объявляет как внешний ключ.К вашему сведению
Объявление внешних ключей с использованием предыдущего метода позволяет только Rails знать о взаимоотношениях моделей / таблиц. База данных неизвестна об отношениях. Поэтому, когда вы генерируете диаграммы EER с помощью программного обеспечения, подобного тому,
MySql Workbench
вы обнаружите, что между моделями не нарисованы потоки взаимосвязей. Как на следующей картинкеОднако, если вы используете более поздний метод, вы обнаружите, что ваш файл миграции выглядит следующим образом:
Теперь внешний ключ установлен на уровне базы данных. и вы можете создавать правильные
EER
диаграммы.источник
add_foreign_key
действие опциейforeign_key: true
наt.references
строку, что подразумеваетindex: true
. Так и сейчасt.references :user, foreign_key: true
. В настоящее время нет документации по этойforeign_key
опции, так что это только мое предположение.add_reference
действия есть:foreign_key
опция, которая добавляет соответствующее ограничение внешнего ключа . Я думаю, что эта опция будет делать то же самое при создании таблицы.add_foreign_key :microposts, :users
какое-либо значение для Rails?Для первого, соглашение по конфигурации. Rails по умолчанию, когда вы ссылаетесь на другую таблицу с
это искать
something_id
.references
, илиbelongs_to
на самом деле более новый способ написания первого с несколькими причудами.Важно помнить, что он не будет создавать внешние ключи для вас. Для того, чтобы сделать это, вам нужно явно установить его, используя:
или (обратите внимание на множественное число):
источник
:polymorphic
опцию (что, IMHO, в большинстве случаев не очень хорошая идея). Если вы хотите использовать внешние ключи в ActiveRecord, используйте иностранец .add_foreign_key
сделал это в ActiveRecord.