Rails 4.x
Quando você já tem users
e uploads
tabelas e deseja adicionar um novo relacionamento entre eles.
Tudo que você precisa fazer é: basta gerar uma migração usando o seguinte comando:
rails g migration AddUserToUploads user:references
O que criará um arquivo de migração como:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Em seguida, execute a migração usando rake db:migrate
. Essa migração cuidará da adição de uma nova coluna denominada user_id
à uploads
tabela (referenciando a id
coluna na users
tabela). Além disso, também adicionará um índice na nova coluna.
UPDATE [Para Rails 4.2]
Não é possível confiar nos Rails para manter a integridade referencial; bancos de dados relacionais vêm em nosso socorro aqui. O que isso significa é que podemos adicionar restrições de chave estrangeira no próprio nível do banco de dados e garantir que o banco de dados rejeite qualquer operação que viole a integridade referencial definida. Como o @infoget comentou, o Rails 4.2 é fornecido com suporte nativo a chaves estrangeiras (integridade referencial) . Não é necessário, mas você pode adicionar uma chave estrangeira (como é muito útil) à referência que criamos acima.
Para adicionar chave estrangeira a uma referência existente , crie uma nova migração para adicionar uma chave estrangeira:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Para criar uma referência totalmente nova com uma chave estrangeira (no Rails 4.2) , gere uma migração usando o seguinte comando:
rails g migration AddUserToUploads user:references
que criará um arquivo de migração como:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Isso adicionará uma nova chave estrangeira à user_id
coluna da uploads
tabela. A chave referencia a id
coluna na users
tabela.
NOTA: Além de adicionar uma referência, você ainda precisará criar uma referência primeiro e depois a chave estrangeira ( você pode optar por criar uma chave estrangeira na mesma migração ou em um arquivo de migração separado ). O Active Record suporta apenas chaves estrangeiras de coluna única e somente atualmente mysql
, mysql2
e os PostgreSQL
adaptadores são suportados. Não tente fazer isso com outros adaptadores como sqlite3
, etc. Consulte Guias do Rails: Chaves estrangeiras para sua referência.
rails g migration AddUserToUploads user:references
produzadd_reference :uploads, :user, index: true, foreign_key: true
na migração apropriada....index: true, foreign_key: true
vez o linhaadd_foreign_key
.foreign_key
et.reference
? Não ét.reference
essencialmente equivalente aforiegn_key
+index
?Trilhos 5
Você ainda pode usar este comando para criar a migração:
A migração parece um pouco diferente de antes, mas ainda funciona:
Note que é
:user
, não:user_id
fonte
Local::User
vez deUser
fazer algo comorails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
naUpload
classe, para que possamos usarupload.user
para obter a instância do usuário.se você gosta de outra abordagem alternativa com
up
edown
método, tente o seguinte:fonte
[Usando o Rails 5]
Gere migração:
Isso criará o arquivo de migração:
Agora, se você observar o arquivo de esquema, verá que a tabela de uploads contém um novo campo. Algo como:
t.bigint "user_id"
out.integer "user_id"
.Migrar banco de dados:
fonte
Outra sintaxe de fazer a mesma coisa é:
fonte
Apenas para documentar se alguém tem o mesmo problema ...
Na minha situação eu tenho usado
:uuid
campos, e as respostas acima não trabalho para o meu caso, porque trilhos 5 estão criando uma coluna usando:bigint
vez:uuid
:fonte
Crie um arquivo de migração
Nome da chave estrangeira padrão
Isso criaria uma coluna user_id na tabela de uploads como uma chave estrangeira
modelo de usuário:
modelo de upload:
Personalizar nome da chave estrangeira:
Isso criaria uma coluna author_id nas tabelas de uploads como a chave estrangeira.
modelo de usuário:
modelo de upload:
fonte