Eu quero fazer um migration
no Rails, referenciando outra tabela. Normalmente, eu faria algo como:
add_column :post, :user, :references
Isso cria uma coluna nomeada user_id
na posts
tabela. Mas e se, em vez de user_id
, eu quiser algo assim author_id
? Como eu posso fazer isso?
schema_plus
gem,t.references :category, index: true, foreign_key: true, references: :match_categories
também funcionou para mim no arquivo de migração.Para Rails 5+
Definição inicial:
Se você estiver definindo sua
Post
tabela de modelos, poderá definirreferences
,index
eforeign_key
em uma linha:Atualização existente:
Se você estiver adicionando referências a uma tabela existente, poderá fazer o seguinte:
Nota: O valor padrão para
index
é verdadeiro.fonte
null
s. Para não permitir, adicione a opção usualnull: false
.No Rails 4.2+, você também pode definir chaves estrangeiras no banco de dados, o que é uma ótima idéia .
Para associações simples, isso também pode ser feito na
t.references
adiçãoforeign_key: true
, mas neste caso você precisará de duas linhas.fonte
references: :users
opção naadd_reference
chamada. Não o vejo documentado nos documentos e parece funcionar do meu lado sem ele.No rails 4, ao usar o postgresql e a gema schema_plus, você pode simplesmente escrever
Isso criará uma coluna
author_id
, à qual corretamente se refereusers(id)
.E no seu modelo, você escreve
Observe que, ao criar uma nova tabela, você pode escrevê-la da seguinte maneira:
fonte
create_table
:t.references :author, references: :users
:references
realmente faça alguma coisa.schema_plus
gema há muito tempo e, na verdade, ela está adicionando essa funcionalidade. Eu editei minha resposta de acordo.t.references :col_name, references: other_table_name
funciona sem a instalação de gemas extras.Se você não estiver usando uma chave estrangeira, não importa qual seja o nome da tabela real da outra tabela.
No Rails 5 , se você estiver usando uma chave estrangeira, poderá especificar o nome da outra tabela nas opções de chave estrangeira. (consulte https://github.com/rails/rails/issues/21563 para discussão)
Antes do Rails 5, você deveria adicionar a chave estrangeira como uma etapa separada:
fonte
{to_table: :users}
alias_attribute (new_name, old_name) é muito útil. Basta criar seu modelo e o relacionamento:
edite o modelo e adicione um alias de atributo com
Depois disso, você poderá executar coisas como
fonte