Aprenda / Ruby on Rails

FundamentosAula 4 de 2018 min0% da trilha

Models e migrations

Migration muda o schema do banco de forma versionada; model é onde validação e associação moram.

Migration — histórico versionado do schema

Uma migration é um arquivo Ruby que descreve uma mudança no schema do banco — criar tabela, adicionar coluna, criar índice. Cada uma tem um timestamp no nome e roda em ordem, uma vez só, registrada numa tabela de controle (schema_migrations) — é assim que o banco de cada desenvolvedor, e de produção, chega no mesmo schema sem ninguém rodar SQL manual.

db/migrate/..._add_estoque_to_produtos.rb
class AddEstoqueToProdutos < ActiveRecord::Migration[7.1]
  def change
    add_column :produtos, :estoque, :integer, default: 0, null: false
    add_index :produtos, :nome
  end
end
terminal
rails db:migrate

Validação — a primeira barreira contra dado ruim

Sem validação, Produto.create(nome: nil) simplesmente cria um produto sem nome no banco. Uma validação recusa isso antes de chegar no banco.

app/models/produto.rb
class Produto < ApplicationRecord
  validates :nome, presence: true, length: { minimum: 3 }
  validates :preco, numericality: { greater_than: 0 }
end
produto = Produto.new(nome: "")
produto.valid?
produto.errors.full_messages

Associação — a relação entre tabelas, em uma linha

app/models/categoria.rb + produto.rb
class Categoria < ApplicationRecord
  has_many :produtos
end

class Produto < ApplicationRecord
  belongs_to :categoria
end

Isso exige uma coluna categoria_id na tabela produtos (adicionada via migration, igual ao exemplo de estoque acima) — a partir daí, categoria.produtos e produto.categoria já funcionam, sem escrever o JOIN na mão.

Exercício

Escreva a migration que adiciona categoria_id (referência) à tabela produtos, e a validação em Produto que exige categoria presente.

Quiz rápido

Pra que serve a tabela de controle que o Rails mantém das migrations já rodadas?
O que has_many/belongs_to fazem entre dois models?