Aqui estão dois códigos de amostra.
Primeiro com collect
:
User.first.gifts.collect(&:id)
Segundo com pluck
:
User.first.gifts.pluck(:id)
Existe alguma diferença entre eles no desempenho ou algo mais?
Aqui estão dois códigos de amostra.
Primeiro com collect
:
User.first.gifts.collect(&:id)
Segundo com pluck
:
User.first.gifts.pluck(:id)
Existe alguma diferença entre eles no desempenho ou algo mais?
Respostas:
pluck
está no nível db. Ele somente consultará o campo específico. Veja isso .
Quando você faz:
User.first.gifts.collect(&:id)
Você tem objetos com todos os campos carregados e simplesmente recebe os id
agradecimentos ao método baseado em Enumerable.
Assim:
se você precisar apenas do id
Rails 4, use ids
:User.first.gifts.ids
se você precisar apenas de alguns campos com o Rails 4, use pluck
:User.first.gifts.pluck(:id, :name, ...)
se você precisar de apenas um campo com o Rails 3, use pluck
:User.first.gifts.pluck(:id)
se você precisar de todos os campos, usecollect
se você precisar de alguns campos com o Rails 4, ainda use pluck
se você precisar de alguns campos com o Rails 3, use select
ecollect
pluck
ing vários campos, Rails 3 não, a menos que você usar solução de Ryan Lefevre
id
, uso .ids
Ref doc: api.rubyonrails.org/classes/ActiveRecord/...
Sim. De acordo com os guias do Rails , pluck
converte diretamente um resultado do banco de dados em um array
, sem construir ActiveRecord
objetos. Isso significa melhor desempenho para uma consulta grande ou frequentemente em execução.
Além da resposta de @ apneadiving, pluck
pode usar nomes de coluna únicos e múltiplos como argumento:
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
Se houver um caso em que você esteja usando poucos atributos do registro recuperado. Nesses casos, você deve usar pluck
.
User.collect(&:email)
No exemplo acima, se você só precisa do atributo de email, está perdendo tempo e memória. Como ele recupera todas as colunas da tabela de usuários no banco de dados, aloca a memória para cada atributo (incluindo os atributos que você nunca usará)
NOTA: pluck
não retorna ActiveRecord_Relation do usuário
pluck
com vários atributos, comopluck(:id, :name)
?