belongs_to: o lado que guarda a chave estrangeira

Prévia grátis 3 min de leitura

Uma linha do código deste app

module Catalog
  class Lesson < ApplicationRecord
    belongs_to :course, class_name: "Catalog::Course", touch: true
  end
end

Isto vem de app/models/catalog/lesson.rb, palavra por palavra. Toda aula que este app mostra pertence a um curso, e esta linha é o que faz lesson.course devolver esse curso em vez de levantar NoMethodError. A opção touch: true atualiza o updated_at do curso sempre que a aula é salva.

Consultas já foram vistas, declarações não

A última aula de SQL: fundamentos de JOIN, "JOINs no Rails: associações ActiveRecord", tratou de joins, includes, eager_load, preload e do problema N+1 a fundo, com linhas como Catalog::Course.joins(:lessons). Ela nunca explicou como :lessons ou :course passaram a existir como nomes que você pode passar para joins(...). Este curso preenche essa lacuna. Ele mostra como belongs_to, has_many e has_one são escritos, e termina com as duas variantes :through do título.

O que belongs_to declara

belongs_to :course significa que esta tabela, lessons, guarda uma coluna de chave estrangeira que aponta para outra tabela, courses. O schema mostra isso:

tabela lessons:
  course_id  bigint   <- a chave estrangeira
  title      jsonb
  position   integer

course_id é uma coluna simples com um valor de courses.id. belongs_to :course transforma esse inteiro em lesson.course, uma instância de Catalog::Course, carregada com uma query própria na primeira vez que você a pede.

Obrigatório por padrão

Rails.application.config.active_record.belongs_to_required_by_default
# => true

Esta é a config do próprio app. No Rails 8, um belongs_to :course simples torna course obrigatório. Salvar uma aula sem course_id falha na validação antes de qualquer coisa chegar ao banco, o mesmo instinto por trás de save! levantar erro com dados ruins em vez de gravar uma linha quebrada. Uma tabela de rascunho com o mesmo formato mostrou isso: uma aula sem curso falhou com Validation failed: Scratch course must exist, e não com um erro do banco.

Para onde o curso vai

Esta aula tratou do trabalho de belongs_to: dizer qual lado guarda a chave estrangeira. A aula 2 trata do outro lado, has_many. A aula 3 trata de has_one, a versão de um registro só da mesma ideia. A aula 4 trata das opções para quando os padrões não servem: foreign_key, class_name e optional. As aulas 5 e 6 chegam ao assunto do título, has_many :through e has_one :through, dois jeitos de alcançar um terceiro model passando por um do meio. A aula 7 junta tudo.

Pontos-chave

  • belongs_to :course, copiado do Catalog::Lesson deste app, significa que esta tabela guarda a coluna de chave estrangeira, course_id, apontando para outra tabela.
  • A config deste app confirma que o Rails 8 torna um belongs_to simples obrigatório por padrão, e uma tabela de rascunho sem curso falhou na validação como esperado.
  • Este curso ensina a declarar associações. Consultá-las com joins, includes e o resto está na aula "JOINs no Rails: associações ActiveRecord" de SQL: fundamentos de JOIN.
Aula 1 de 7 · grátis

Continue com a aula 2

has_many: o lado com a coleção

Como has_many devolve uma Relation de linhas filhas, com dependent: :destroy e build preenchendo a chave estrangeira.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...