[ruby-on-rails] Rails에서 pluck과 collect의 차이점은 무엇입니까?

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

첫 번째 collect:

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

두 번째 pluck:

User.first.gifts.pluck(:id)

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



답변

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


답변

예. 레일 가이드에 따르면 , 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을 반환하지 않습니다 .


답변