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.
class AddEstoqueToProdutos < ActiveRecord::Migration[7.1]
def change
add_column :produtos, :estoque, :integer, default: 0, null: false
add_index :produtos, :nome
end
endrails db:migrateValidaçã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.
class Produto < ApplicationRecord
validates :nome, presence: true, length: { minimum: 3 }
validates :preco, numericality: { greater_than: 0 }
endproduto = Produto.new(nome: "")
produto.valid?
produto.errors.full_messagesAssociação — a relação entre tabelas, em uma linha
class Categoria < ApplicationRecord
has_many :produtos
end
class Produto < ApplicationRecord
belongs_to :categoria
endIsso 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.