ruby-on-rails - livro - ruby on rails manual



gerar modelo usando user: references vs user_id: integer (2)

Como o Rails sabe que user_id é um user referência de chave estrangeira?

O próprio Rails não sabe que user_id é um user referência de chave estrangeira. No primeiro comando rails generate model Micropost user_id:integer ele só adiciona uma coluna user_id porém o rails não sabe o uso da col. Você precisa colocar manualmente a linha no modelo Micropost

class Micropost < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :microposts
end

as palavras-chave belongs_to e has_many determinam o relacionamento entre esses modelos e declaram user_id como uma chave estrangeira para User modelo User .

Os rails generate model Micropost user:references comando posteriores rails generate model Micropost user:references adiciona a linha belongs_to :user no modelo Micropost e declara como chave estrangeira.

Para sua informação
Declarar as chaves estrangeiras usando o método antigo apenas permite que o Rails saiba sobre o relacionamento que os modelos / tabelas possuem. O banco de dados é desconhecido sobre o relacionamento. Portanto, quando você gera os diagramas de EER usando software como o MySql Workbench descobre que não há encadeamentos de relacionamento entre os modelos. Como na foto a seguir

No entanto, se você usar o método posterior, descobrirá que o arquivo de migração é semelhante a:

def change
    create_table :microposts do |t|
      t.references :user, index: true

      t.timestamps null: false
    end
    add_foreign_key :microposts, :users

Agora, a chave estrangeira é configurada no nível do banco de dados. e você pode gerar diagramas adequados de EER .

https://src-bin.com

Estou confuso sobre como gerar um modelo que pertence a outro modelo. Meu livro usa essa sintaxe para associar o Micropost ao usuário:

rails generate model Micropost user_id:integer

mas http://guides.rubyonrails.org/ diz para fazer assim:

rails generate model Micropost user:references

As migrações geradas por esses dois são diferentes. Além disso, para o primeiro, como o rails sabe que user_id é um user referência de chave estrangeira? Obrigado!


Answer #1

Ambos irão gerar as mesmas colunas quando você executar a migração. No console de trilhos, você pode ver que este é o caso:

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)

O segundo comando adiciona um relacionamento belongs_to :user em seu modelo Micropost, enquanto o primeiro não. Quando esse relacionamento é especificado, o ActiveRecord assumirá que a chave estrangeira é mantida na coluna user_id e usará um modelo chamado User para instanciar o usuário específico.

O segundo comando também adiciona um índice na nova coluna user_id .





ruby-on-rails