Associações ActiveRecord: polimórficas
Associações polimórficas permitem que uma única associação do ActiveRecord aponte para vários tipos de model, decididos por linha. O curso parte de um Comment que precisa se ligar a um Article ou a uma Photo, e mostra por que uma coluna anulável por tipo não se sustenta. Trata das colunas commentable_type e commentable_id, do lado inverso com has_many e as:, e de dependent: :destroy. Explica por que não há chave estrangeira no banco e o que um tipo desatualizado levanta. Por fim, mostra o Active Storage usando o mesmo mecanismo e consultas por tipo.
O que você vai aprender
- ✓Por que uma coluna belongs_to anulável por tipo permite linhas inválidas
- ✓As colunas commentable_type e commentable_id por trás de belongs_to com polymorphic: true
- ✓O lado inverso com has_many e a opção as:
- ✓Como dependent: :destroy faz a cascata por tipo e por que não há chave estrangeira no banco
- ✓Como um tipo desatualizado ou inventado levanta NameError
- ✓Como os anexos do Active Storage usam o mesmo mecanismo, e consultas por tipo
Uma associação, vários tipos possíveis
Associações ActiveRecord: through tratou de belongs_to, has_many, has_one e :through, e cada uma delas apontava para um outro tipo de model. Catalog::Lesson belongs_to :course sempre significa um Catalog::Course do outro lado. Esse tipo fixo está embutido em course_id: uma coluna inteira que só…
Ler a aula completa grátis →Currículo
7 aulasUma associação, vários tipos possíveis
Mostra por que um belongs_to anulável por tipo falha para um Comment ligado a artigos ou fotos.
As duas colunas de que um belongs_to polimórfico precisa
Explica as colunas commentable_type e commentable_id e como ler commentable devolve a linha original.
O lado reverso: has_many ..., as: :commentable
Trata de has_many com as: :commentable, que filtra os comentários por tipo e id em cada model.
dependent: :destroy, e uma armadilha que vale conhecer
Mostra a cascata por tipo de dependent: :destroy, a falta de chave estrangeira e o NameError de tipos desatualizados.
O mesmo mecanismo, já rodando neste app
Liga has_one_attached e has_many_attached ao belongs_to polimórfico dentro de ActiveStorage::Attachment.
Consultando por tipo
Filtra e conta registros pela coluna de tipo usando chamadas comuns de where e group.
Juntando tudo: uma associação, resolvida em tempo de execução
Revisa o padrão polimórfico em duas classes, das colunas de tipo e id até as consultas.