belongs_to: o lado que guarda a chave estrangeira
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 doCatalog::Lessondeste 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_tosimples 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,includese o resto está na aula "JOINs no Rails: associações ActiveRecord" de SQL: fundamentos de JOIN.
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.