Associações ActiveRecord: through
O curso mostra como declarar associações ActiveRecord, com exemplos tirados dos models deste app. Começa por belongs_to, o lado que guarda a chave estrangeira, e por has_many, o lado que devolve uma coleção. Depois vem has_one, que devolve um registro ou nil. As opções foreign_key, class_name, optional e dependent cobrem os casos em que os padrões do Rails não servem. As últimas aulas tratam de has_many :through e has_one :through, que alcançam um terceiro model passando por um do meio, e da opção source para nomes que não batem.
O que você vai aprender
- ✓Declarar belongs_to e por que o Rails 8 o torna obrigatório por padrão
- ✓Usar has_many para devolver uma coleção e construir registros por ela
- ✓Usar has_one para um único registro e os métodos create_ que ele gera
- ✓Definir foreign_key, class_name, optional e dependent quando os padrões não servem
- ✓Alcançar um terceiro model com has_many :through e a opção source
- ✓Usar has_one :through para chegar a um registro passando por um model do meio
belongs_to: o lado que guarda a chave estrangeira
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.
Ler a aula completa grátis →Currículo
7 aulasbelongs_to: o lado que guarda a chave estrangeira
Como belongs_to indica a tabela que guarda a chave estrangeira, e por que o Rails 8 o exige.
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.
has_one: exatamente um, não uma coleção
Como has_one devolve um registro ou nil, gera métodos create_ e deixa a unicidade para índices ou validações.
Opções de nomeação: foreign_key, class_name, e optional
Uso de foreign_key, class_name, optional: true e dependent: :nullify quando a associação foge dos padrões do Rails.
has_many :through: pulando a tabela do meio
Como has_many :through chega aos badges por um model de junção, e quando a opção source é necessária.
has_one :through: a mesma ideia, um registro de cada vez
Um exemplo com Supplier, Account e AccountHistory mostrando has_one :through devolvendo um registro ou nil.
Juntando tudo: o kit completo de declaração
Uma revisão de cada declaração e opção do curso, todas tiradas dos models deste app, menos o exemplo de has_one :through.