Querying ActiveRecord: pluck
Este curso trata de como o .pluck e métodos próximos do ActiveRecord escolhem quais colunas carregam. Ele começa pelo .pick, que acrescenta LIMIT 1 e devolve um valor só. Compara o custo em consultas de .pluck e .map(&:attr) em relations carregadas e não carregadas. Mostra .pluck através de um join, como o join multiplica linhas e como .distinct remove duplicatas no SQL. Explica por que .pluck encerra a cadeia, como ele pula o fallback de idioma do Translatable em colunas JSONB e como o app guarda ids extraídos num Set para consultas rápidas.
O que você vai aprender
- ✓Usar .pick para buscar um valor só com LIMIT 1
- ✓Quando .pluck custa uma consulta em comparação com .map(&:attr)
- ✓Extrair colunas de uma tabela juntada e remover duplicatas com .distinct
- ✓Por que .pluck precisa ser a última chamada da cadeia
- ✓Como .pluck pula o fallback de idioma do Translatable em colunas JSONB
- ✓Extrair ids de chave estrangeira para um Set e conferir pertencimento rápido
.pick: o atalho de uma linha só do .pluck
A aula "SELECT & FROM no Rails", de SQL puro: SELECT e FROM, tratou do básico. .select(:name, :email) devolve objetos de model só com as colunas escolhidas preenchidas, e uma coluna não selecionada volta como nil, igual a um NULL do banco. .pluck(:name) pula a criação de models e devolve um array…
Ler a aula completa grátis →Currículo
7 aulas.pick: o atalho de uma linha só do .pluck
.pick devolve um valor com LIMIT 1 no SQL, enquanto .pluck.first busca antes todas as linhas que batem.
.pluck vs .map(&:attr): o que custa uma query
.pluck estreita o SELECT em relations não carregadas, lê da memória nas carregadas e sempre consulta para expressões SQL.
.pluck através de um join
Uma string qualificada como "lessons.title" extrai coluna da tabela juntada, e o INNER JOIN devolve uma linha por aula.
distinct.pluck: removendo duplicatas de uma coluna extraída
Chamar .distinct antes de .pluck põe DISTINCT no SQL, e chamá-lo depois levanta NoMethodError no array.
.pluck encerra a cadeia: ele devolve um array
.pluck devolve um Array comum do Ruby, então todo .where, .joins e .order precisa vir antes dele.
A armadilha do Translatable: .pluck pula o fallback de idioma
.pluck lê colunas JSONB do Translatable como hashes crus e pula o fallback de I18n.locale do método title.
Juntando tudo: pluck para IDs, não só exibição
As consultas de progresso do app extraem ids de chave estrangeira e usam .to_set para conferências O(1).