Rails에서 pluck과 collect의 차이점은 무엇입니까?


123

다음은 두 가지 샘플 코드입니다.

첫 번째 collect:

User.first.gifts.collect(&:id)

두 번째 pluck:

User.first.gifts.pluck(:id)

성능이나 다른 점에서 차이가 있습니까?

답변:


230

pluckdb 수준에 있습니다. 특정 필드 만 쿼리합니다. 이것을보십시오 .

당신이 할 때 :

 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에서 일부 필드가 필요한 경우 selectcollect


"일부 필드가 필요하면 selectand collect를 사용하십시오."- pluck같은 여러 속성과 함께 사용할 수 pluck(:id, :name)없습니까?
Alexander

@AlexPopov - 레일 4+ 지원하는 pluck여러 필드를 보내고, 3하지 않습니다 레일 당신은 사용하지 않는 라이언 페브르의 해결 방법
marksiemers

3
레일 4에서는 경우 에만 필요 id, 사용 .ids참조의 문서를 : api.rubyonrails.org/classes/ActiveRecord/...
이반 차우

30

예. 레일 가이드에 따르면 , pluck직접으로 데이터베이스 결과를 변환 array구성하지 않고, ActiveRecord객체. 이는 대규모 또는 자주 실행되는 쿼리에 대해 더 나은 성능을 의미합니다.

@apneadiving의 답변 외에도 pluck단일 및 다중 열 이름을 인수로 사용할 수 있습니다.

Client.pluck(:id, :name)
# SELECT clients.id, clients.name FROM clients
# => [[1, 'David'], [2, 'Jeremy'], [3, 'Jose']]

3

기본 및 주요 차이점은 Pluck이 db 수준에 적용되고 모든 데이터를 수집 한 다음 모든 레코드가 필요하면 collect를 사용하고 필드가 거의없는 경우 pluck을 사용하여 레코드를 반환한다는 것입니다.


2

검색된 레코드의 속성을 거의 사용하지 않는 경우가 있습니다. 이러한 경우 pluck.

User.collect(&:email)

위의 예에서 메모리와 시간을 낭비하는 것보다 이메일 속성 만 필요한 경우. 데이터베이스의 사용자 테이블에서 모든 열을 검색하기 때문에 각 속성 (사용하지 않을 속성 포함)에 대한 메모리를 할당합니다.

참고 : pluck사용자의 ActiveRecord_Relation을 반환하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.