— rails — 1 min read
Comecei a trabalhar com o pessoal da Thoughtbot em agosto desse ano e antes de entrar no time estava dando uma relembrada/estudada em Ruby e Ruby on Rails. Uma das paradas que encontrei foi a belezinha que inspirou esse post.
Imagina que em uma aplicação nós temos modelos que se relacionam. Como, por exemplo, um usuário e seus compromissos. Nesse caso, cada registro do modelo Compromisso (Appointment) pertence a um registro do modelo Usuário (User). E nós queremos selecionar todos os usuários que tem compromisso no mês de janeiro de 2022. Há várias formas de fazer essa seleção, algumas são bastante contra-indicadas, como olhar todos compromissos de janeiro de 2022 e ir uma a uma coletando os usuários (NÃO FAÇA ISSO).
Para esse tipo de seleção, nós precisamos de um JOIN
.
1User.joins(:appointments)
A partir desse JOIN
, nós podemos fazer o nosso filtro pelo campo que contém a data, exemplo starts_at
, que é um campo do Compromisso (Appointment
).
1january_start = DateTime.new(2022, 1, 1).beginning_of_month2january_end = january_start.end_of_month3
4User.joins(:appointments)5 .where({ appointments: { starts_at: january_start..january_end } })
Tem um jeito de fazer que gera a mesma query
, mas eu acho que fica mais legível, principalmente, quando esses filtros nas relações são mais complexos.
1january_start = DateTime.new(2022, 1, 1).beginning_of_month2january_end = january_start.end_of_month3
4appointments_in_january = Appointment.where(5 starts_at: january_start..january_end6)7
8User.joins(:appointments).merge(appointments_in_january)
Assim, selecionamos os usuários que tem compromissos começando em Janeiro de 2022.
Eu aprendi isso e outras coisas mais em um dos cursos do Upcase (plataforma de cursos, gratuitos, desenvolvidos pela Thoughtbot). Para saber mais: