Rails 4.x
Когда у вас уже есть users
и uploads
таблицы и вы хотите добавить новые отношения между ними.
Все, что вам нужно сделать, это просто сгенерировать миграцию с помощью следующей команды:
rails g migration AddUserToUploads user:references
Который создаст файл миграции как:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Затем запустите миграцию, используя rake db:migrate
. Эта миграция позаботится о добавлении нового столбца с именем user_id
в uploads
таблицу (ссылка на id
столбец в users
таблице), а также добавит индекс для нового столбца.
ОБНОВЛЕНИЕ [Для Rails 4.2]
Rails нельзя доверять для поддержания ссылочной целостности; Реляционные базы данных приходят нам на помощь здесь. Это означает, что мы можем добавить ограничения внешнего ключа на самом уровне базы данных и гарантировать, что база данных отклонит любую операцию, которая нарушает этот набор ссылочной целостности. Как прокомментировал @infoget, Rails 4.2 поставляется с собственной поддержкой внешних ключей (ссылочная целостность) . Это не обязательно, но вы можете добавить внешний ключ (поскольку он очень полезен) к ссылке, которую мы создали выше.
Чтобы добавить внешний ключ к существующей ссылке , создайте новую миграцию для добавления внешнего ключа:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Чтобы создать совершенно новую ссылку с внешним ключом (в Rails 4.2) , создайте миграцию с помощью следующей команды:
rails g migration AddUserToUploads user:references
который создаст файл миграции как:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Это добавит новый внешний ключ в user_id
столбец uploads
таблицы. Ключ ссылается на id
столбец в users
таблице.
ПРИМЕЧАНИЕ. Это в дополнение к добавлению ссылки, поэтому вам все равно нужно сначала создать ссылку, а затем внешний ключ ( вы можете создать внешний ключ в той же миграции или в отдельном файле миграции ). Active Record поддерживает только одного столбца внешних ключей и в настоящее время только mysql
, mysql2
и PostgreSQL
адаптеры поддерживаются. Не пытайтесь сделать это с другими адаптерами, например sqlite3
, и т. Д. Обратитесь к Руководству по Rails: внешние ключи для вашей справки.
rails g migration AddUserToUploads user:references
производитadd_reference :uploads, :user, index: true, foreign_key: true
в соответствующей миграции....index: true, foreign_key: true
вместо строкиadd_foreign_key
.foreign_key
и другоеt.reference
? Поt.reference
существу не эквивалентноforiegn_key
+index
?Рельсы 5
Вы все еще можете использовать эту команду для создания миграции:
Миграция выглядит немного иначе, чем раньше, но все еще работает:
Обратите внимание, что это
:user
не:user_id
источник
Local::User
вместо того, чтобыUser
делать что-то подобноеrails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
вUpload
класс, чтобы мы могли использоватьupload.user
для получения пользовательского экземпляра.если вы хотите еще один альтернативный подход с
up
иdown
способ попробовать это:источник
[Использование Rails 5]
Генерация миграции:
Это создаст файл миграции:
Теперь, если вы наблюдаете файл схемы, вы увидите, что таблица загрузки содержит новое поле. Что-то вроде:
t.bigint "user_id"
илиt.integer "user_id"
.Перенос базы данных:
источник
Другой синтаксис того же действия:
источник
Просто документировать, если у кого-то есть такая же проблема ...
В моей ситуации я использовал
:uuid
поля, и приведенные выше ответы не работают в моем случае, потому что рельсы 5:bigint
вместо этого создают столбец:uuid
:источник
Создать файл миграции
Имя внешнего ключа по умолчанию
Это создаст столбец user_id в таблице загрузок в качестве внешнего ключа.
модель пользователя:
загрузить модель:
Настройте имя внешнего ключа:
Это создаст столбец author_id в таблицах загрузки в качестве внешнего ключа.
модель пользователя:
загрузить модель:
источник