The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2020-06-03
Desenvolvimento de software

Interface de consulta de registos activos

Marta Polec

O desempenho é um dos aspectos mais importantes a ter em conta no desenvolvimento de aplicações Web. Analisar a forma como os dados são obtidos a partir de uma base de dados é um bom ponto de partida para procurar melhorias. Neste artigo, encontrará exemplos de como melhorar o desempenho através da utilização de funções agregadas e da filtragem de dados ao nível da base de dados.

Para começar, um pouco de contexto

Este artigo é inspirado num problema real que já me foi colocado. Lidar com ele ensinou-me muito, e ainda o tenho como referência na minha mente. Penso que os exemplos são um bom recurso de aprendizagem, pois podem clarificar muita coisa. Neste artigo, gostaria de partilhar consigo alguns exemplos de utilização dos métodos de consulta do Active Record.

Para não introduzir pormenores específicos do domínio, utilizarei uma aplicação de amostra para uma biblioteca para ilustrar os exemplos. É tudo bastante simples, como mostra o diagrama abaixo. Temos quatro tabelas: autores, livros, utilizadores e alugueres. Um utilizador pode pedir emprestado muitos livros e um livro pode ser emprestado por muitos utilizadores, pelo que precisamos de uma tabela de junção para modelar relações de muitos para muitos. No nosso caso, é a tabela de alugueres. Também guardamos aí algumas informações adicionais, que são as datas de empréstimo e devolução. Um autor pode ter muitos livros atribuídos ao seu nome. Um livro também tem um atributo que define o seu género.

Estatísticas de leitura do utilizador

A tarefa era preparar estatísticas para um único utilizador, de modo a podermos saber quantos livros de cada género foram emprestados. A minha primeira ideia foi ir buscar todos os livros que foram emprestados pelo utilizador, agrupá-los por género e depois fazer o mapeamento, para que cada género tivesse um número de livros atribuído em vez de uma lista. Eis o que me ocorreu:

Hash[Book.joins(:rentals).where(rentals: { user: user }).group_by(&:genre).map { |genre, books| [genre, books.size] }]

Embora esta abordagem funcione e tenha um aspeto limpo, não utiliza todas as possibilidades que os métodos de consulta Active Record oferecem. Graças a eles, podemos filtrar e agregar dados a nível da base de dados sem utilizar SQL em bruto diretamente no nosso código. Operar a um nível db também aumenta a nossa eficiência.

No exemplo acima, podemos utilizar o método group em vez do group do Rubypor método. Aplicar-se-á a GRUPOBY na consulta tSQL. Além disso, o método de mapeamento e tamanho pode ser substituído por uma função de agregação de contagem. No final, ficamos com uma consulta que se parece com isto:

Livro.junta(:alugueres).where(alugueres: { utilizador: utilizador }).grupo(:género).contagem(:livros)

Parece ainda mais simples!

Outros exemplos úteis

Em seguida, encontrará outras formas de utilizar os métodos de consulta que considero que vale a pena conhecer.

Convite para utilizadores inactivos

TAREFA: Filtrar os utilizadores que nunca pediram um livro emprestado ou que o fizeram há mais de um ano.

Poderíamos ir buscar todos os utilizadores, incluindo os alugueres associados, e depois filtrá-los utilizando o método select.

User.includes(:rentals).select do |user|
 utilizador.alugueres.vazio? || utilizador.alugueres.nenhum? { |rental| rental.start_date >= Date.today - 1.year }
end 

Mas, como é óbvio, não é necessário ir buscar tudo. Utilizando os métodos de consulta, podemos filtrar tudo ao nível da base de dados. Primeiro, vamos selecionar os utilizadores que pediram alguns livros emprestados no último ano e depois excluí-los da seleção final.

Este é o aspeto da subconsulta:

Utilizador.junta(:alugueres).where(alugueres: { start_date: (Date.today - 1.year).Date.today })

E agora, vamos juntar tudo:

Utilizador.where.not(id: [User.joins(:rentals).where(rentals: { start_date: (Date.today - 1.year)..Date.today })])

Autores sub-representados

TAREFA: Obter autores com um ou zero livros emprestados

Fazê-lo com o método select é super simples, mas mais uma vez - não há necessidade de operar num conjunto tão grande de dados, uma vez que a base de dados pode filtrá-los para nós:

Author.includes(:books).select { |author| author.books.size <= 1 }

Depois, é fácil e rápido filtrar os autores com zero livros atribuídos:

Author.left_joins(:books).where(books: { id: nil })

É importante lembrar-se de uma coisa ao utilizar left_joins (e outer joins em geral). Se existirem registos na tabela da esquerda (aqui: autores) que não tenham registos correspondentes na tabela da direita (aqui: livros), então, em resultado, as colunas da tabela da direita serão preenchidas com valores nulos.

Como também precisamos de autores com um livro atribuído no sistema, há mais algumas operações a efetuar. Teremos de efetuar o agrupamento, a contagem e a adição de uma condição. Eis como juntar tudo isto:

Author.left_joins(:books).group(:id).having("count(*) <= ?", 1)

A condição vem depois da função de agregação, pelo que temos de utilizar a cláusula HAVING, em vez da cláusula WHERE, para a especificar.

Vale a pena verificar os métodos de consulta do Active Record quando se pensa no desempenho da aplicação. Podem simplificar o seu código e torná-lo mais rápido. Espero que os exemplos partilhados o ajudem a explorar as possibilidades que os métodos de consulta têm para oferecer.

Ler mais:

– Chegou a altura de uma nova realidade. A era do trabalho remoto começou há um mês

– Precisa de utilizar as estruturas JS comuns na sua aplicação Rails? O Stimulus.js pode ser uma alternativa

– Desenvolvimento de aplicações Web: Porque é que vale a pena escolher a tecnologia Ruby on Rails?

Artigos relacionados

Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
Desenvolvimento de software

Softwares para o setor de saúde: Tipos, casos de uso

As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

OCODEST
Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
Desenvolvimento de software

Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

OCODEST
Desenvolvimento de software

Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

OCODEST
Desenvolvimento de software

As 10 principais empresas de desenvolvimento de software sediadas na Letónia

Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

thecodest
Soluções para empresas e escalas

Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

thecodest

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese