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:
pluckestá 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 idagradecimentos ao método baseado em Enumerable.
Assim:
se você precisar apenas do idRails 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 selectecollect
plucking vários campos, Rails 3 não, a menos que você usar solução de Ryan Lefevre
id, uso .idsRef doc: api.rubyonrails.org/classes/ActiveRecord/...
Sim. De acordo com os guias do Rails , pluckconverte diretamente um resultado do banco de dados em um array, sem construir ActiveRecordobjetos. Isso significa melhor desempenho para uma consulta grande ou frequentemente em execução.
Além da resposta de @ apneadiving, pluckpode 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: plucknão retorna ActiveRecord_Relation do usuário
pluckcom vários atributos, comopluck(:id, :name)?