Ответ 1
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
to uploads
(ссылка на столбец id
в таблице users
), PLUS также добавит индекс в новый столбец.
ОБНОВЛЕНИЕ [для 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 Guides: Foreign Keys.