다음은 두 가지 샘플 코드입니다.
첫 번째 collect
:
User.first.gifts.collect(&:id)
두 번째 pluck
:
User.first.gifts.pluck(:id)
성능이나 다른 점에서 차이가 있습니까?
답변
pluck
db 수준에 있습니다. 특정 필드 만 쿼리합니다. 이것을보십시오 .
당신이 할 때 :
User.first.gifts.collect(&:id)
모든 필드가로드 된 개체가 id
있으며 Enumerable 기반 메서드 덕분에 간단히 얻을 수 있습니다.
그래서:
-
Rails 4 에만 필요한 경우 다음을
id
사용하십시오ids
.User.first.gifts.ids
-
Rails 4에서 일부 필드 만 필요한 경우 다음을 사용하십시오
pluck
.User.first.gifts.pluck(:id, :name, ...)
-
Rails 3에 하나의 필드 만 필요한 경우 다음을 사용하십시오
pluck
.User.first.gifts.pluck(:id)
-
모든 필드 가 필요한 경우
collect
-
Rails 4에서 일부 필드가 필요한 경우 여전히
pluck
-
Rails 3에서 일부 필드가 필요한 경우
select
및collect
답변
예. 레일 가이드에 따르면 , pluck
직접으로 데이터베이스 결과를 변환 array
구성하지 않고, ActiveRecord
객체. 이는 대규모 또는 자주 실행되는 쿼리에 대해 더 나은 성능을 의미합니다.
@apneadiving의 답변 외에도 pluck
단일 및 다중 열 이름을 인수로 사용할 수 있습니다.
Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]
답변
기본 및 주요 차이점은 Pluck이 db 수준에 적용되고 모든 데이터를 수집 한 다음 모든 레코드가 필요하면 collect를 사용하고 필드가 거의없는 경우 pluck을 사용하여 레코드를 반환한다는 것입니다.
답변
검색된 레코드의 속성을 거의 사용하지 않는 경우가 있습니다. 이러한 경우 pluck
.
User.collect(&:email)
위의 예에서 메모리와 시간을 낭비하는 것보다 이메일 속성 만 필요한 경우. 데이터베이스의 사용자 테이블에서 모든 열을 검색하기 때문에 각 속성 (사용하지 않을 속성 포함)에 대한 메모리를 할당합니다.
참고 : pluck
사용자의 ActiveRecord_Relation을 반환하지 않습니다 .