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?
fonte
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?
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
com vários atributos, comopluck(:id, :name)
?pluck
ing vários campos, Rails 3 não, a menos que você usar solução de Ryan Lefevreid
, 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 umarray
, sem construirActiveRecord
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:fonte
A diferença básica e principal é que Pluck se aplica no nível de banco de dados e coleta, obtém todos os dados e retorna o registro para você quando você precisar que todos os registros usem collect e quando alguns campos usem pluck
fonte
Se houver um caso em que você esteja usando poucos atributos do registro recuperado. Nesses casos, você deve usar
pluck
.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áriofonte