Estou confuso sobre como gerar um modelo que pertence a outro modelo. Meu livro usa essa sintaxe para associar Micropost ao usuário:
rails generate model Micropost user_id:integer
mas http://guides.rubyonrails.org/ diz para fazê-lo assim:
rails generate model Micropost user:references
As migrações geradas por esses 2 são diferentes. Além disso, para o primeiro, como o Rails sabe que user_id
é uma referência de chave estrangeira user
? Obrigado!
fonte
O próprio Rails não sabe que
user_id
é uma referência de chave estrangeirauser
. No primeiro comando,rails generate model Micropost user_id:integer
ele adiciona apenas uma coluna,user_id
mas o Rails não conhece o uso do col. Você precisa colocar manualmente a linha noMicropost
modeloas palavras-chave
belongs_to
ehas_many
determinar a relação entre esses modelos e declararuser_id
como uma chave estrangeira para oUser
modelo.O comando posterior
rails generate model Micropost user:references
adiciona a linhabelongs_to :user
noMicropost
modelo e declara como uma chave estrangeira.Para sua informação,
declarar as chaves estrangeiras usando o método anterior apenas permite que o Rails saiba sobre o relacionamento que os modelos / tabelas têm. O banco de dados é desconhecido sobre o relacionamento. Portanto, quando você gera os diagramas EER usando um software como
MySql Workbench
o encontrado, não há segmentos de relacionamento desenhados entre os modelos. Como na foto a seguirNo entanto, se você usar o método posterior, verá que o arquivo de migração se parece com:
Agora a chave estrangeira está definida no nível do banco de dados. e você pode gerar
EER
diagramas adequados .fonte
add_foreign_key
ação por uma opçãoforeign_key: true
para at.references
linha, o que implicaindex: true
. Então é agorat.references :user, foreign_key: true
. No momento, não há documentação para aforeign_key
opção disponível, portanto essa é apenas minha suposição.add_reference
ação tem uma:foreign_key
opção que adiciona uma restrição de chave estrangeira apropriada . Eu acho que essa opção faria o mesmo ao criar a tabela.add_foreign_key :microposts, :users
alguma diferença para o Rails?Para o primeiro, convenção sobre configuração. O padrão do Rails quando você faz referência a outra tabela com
é procurar
something_id
.references
, oubelongs_to
é realmente a maneira mais nova de escrever o primeiro com algumas peculiaridades.Importante é lembrar que ele não criará chaves estrangeiras para você. Para fazer isso, você precisa configurá-lo explicitamente usando:
ou (observe o plural):
fonte
:polymorphic
opção (que IMHO, na maioria dos casos, não é uma boa ideia). Se você deseja utilizar chaves estrangeiras no ActiveRecord, use estrangeiro .add_foreign_key
chegou ao ActiveRecord.