Querying: includes e joins
O curso trata de como o ActiveRecord consulta dados relacionados entre tabelas. Começa por .merge, que reusa um scope do model juntado. Mostra por que joins com .count devolve linhas duplicadas e como .distinct corrige a contagem. Apresenta where.associated e where.missing como filtros de existência com nome próprio. Explica o eager loading através de has_many :through e de uma associação polimórfica, inclusive por que eager_load levanta erro nesse caso. Termina com strict_loading, que levanta erro em vez de rodar uma consulta preguiçosa, e com um cenário que junta todas as mecânicas.
O que você vai aprender
- ✓Reusar um scope do model juntado com .merge
- ✓Evitar linhas duplicadas em agregações sobre joins com .distinct
- ✓Filtrar pela existência de associações com where.associated e where.missing
- ✓Fazer eager loading de has_many :through e de associações polimórficas
- ✓Levantar erro no carregamento preguiçoso com strict_loading
.merge: reusando um scope do model juntado
A aula "JOINs no Rails: associações ActiveRecord", de SQL: fundamentos de JOIN, é completa. Ela trata de joins (um INNER JOIN que filtra e não carrega), de left_joins (um LEFT OUTER JOIN, inclusive anti-joins) e das três estratégias de carregamento includes, eager_load e preload. Ela percorre o…
Ler a aula completa grátis →Currículo
7 aulas.merge: reusando um scope do model juntado
Como .merge reusa o scope active de Course numa relation com join, gerando o mesmo SQL que um where.
A armadilha joins + .count: linhas duplicadas do JOIN
Por que joins(:lessons).count conta pares curso-aula, como .distinct.count corrige isso e por que includes(:lessons).count dispensa o JOIN.
where.associated e where.missing: filtros de existência prontos
where.missing e where.associated como nomes prontos para o anti-join e o filtro de existência, ainda exigindo .distinct em contagens.
Eager loading através de uma associação has_many :through
Por que includes(:badges) numa associação has_many :through manda três consultas, com uma a mais para a tabela user_badges.
Eager loading de uma associação polimórfica
Como includes(:record) manda uma consulta por record_type distinto e por que eager_load levanta EagerLoadPolymorphicError em associações polimórficas.
strict_loading: levantando erro em vez de ser lento
Como strict_loading levanta StrictLoadingViolationError no acesso preguiçoso a associações, enquanto as pré-carregadas com includes continuam funcionando.
Juntando tudo: todas as mecânicas num cenário
Um cenário de progresso de badges que combina strict_loading, joins com merge, distinct, includes e carregamento antecipado :through.