레일즈에서 플럭과 수집의 차이점은 무엇입니까?
여기 두 개의 샘플 코드가 있습니다.
첫 번째는collect
:
User.first.gifts.collect(&:id)
두 번째는 다음과 함께.pluck
:
User.first.gifts.pluck(:id)
그들 사이에 성능이나 다른 점에서 차이가 있습니까?
pluck
DB 레벨에 있습니다.특정 필드만 쿼리합니다.이거 보세요.
다음 작업을 수행할 때:
User.first.gifts.collect(&:id)
모든 필드가 로드된 개체가 있으면 다음과 같은 정보를 얻을 수 있습니다.id
Enumerable을 기반으로 한 방법 덕분입니다.
그래서:
만약 당신이 필요하다면.
id
레일 4와 함께, 사용ids
:User.first.gifts.ids
레일 4의 일부 필드만 필요한 경우
pluck
:User.first.gifts.pluck(:id, :name, ...)
레일 3에서 하나의 필드만 필요한 경우
pluck
:User.first.gifts.pluck(:id)
모든 필드가 필요한 경우,
collect
레일 4의 일부 필드가 필요한 경우에도 여전히 사용
pluck
레일 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']]
기본적이고 주요한 차이점은 플럭이 DB 레벨에 적용되어 모든 데이터를 수집한 다음 모든 레코드가 필요할 때 레코드를 반환하고 필드가 거의 없을 때 플럭을 사용한다는 것입니다.
검색된 레코드의 속성을 거의 사용하지 않는 경우.이러한 경우에는 다음을 사용해야 합니다.pluck
.
User.collect(&:email)
위의 예에서는 메모리와 시간을 낭비하는 것보다 전자 메일 특성만 필요한 경우입니다.데이터베이스의 사용자 테이블에서 모든 열을 검색하므로 에서는 각 특성(사용자가 절대 사용하지 않을 특성 포함)에 대해 메모리를 할당합니다.
참고:pluck
사용자의 ActiveRecord_Relation을 반환하지 않습니다.
파티에 늦었지만, 당신이 더 깊은 것을 원한다면요.pluck
사용할 수 있습니다.includes
:
User.all.includes(:groups).pluck("users.id", "users.name", "groups.id", "groups.name")
이는 다음과 같은 더 큰 배열을 초래합니다.
[
[12, "Sam", 4, "FriendsRUs"],
...
]
사이의 주요 차이점collect
그리고.pluck
그것은collect
모든 속성을 DB에서 로드하는 동안pluck
사용자가 언급한 특성만 로드합니다.예를 들어 다음 작업을 수행할 때:
User.all.collect(&:id)
메모리에 사용자 레코드의 모든 특성을 로드하고 ID를 반환합니다.그리고 당신이 할 때:
User.all.pluck(:id)
이렇게 하면 메모리에 ID만 로드되므로 몇 가지 속성에만 액세스해야 하는 경우에 더 효율적입니다.
언급URL : https://stackoverflow.com/questions/12176102/what-is-the-difference-between-pluck-and-collect-in-rails
'programing' 카테고리의 다른 글
과부하 상태에서 스레드 풀 부족 문제 해결 (0) | 2023.06.04 |
---|---|
[ : 셸 프로그래밍에서 예기치 않은 연산자 (0) | 2023.06.04 |
iOS: UTC NSDate를 로컬 표준시로 변환 (0) | 2023.06.04 |
오류(ORA-00923: FROM 키워드를 찾을 수 없습니다.) (0) | 2023.06.04 |
Git에서 다음 커밋을 찾으려면 어떻게 해야 합니까? (참조인의 자녀/자녀) (0) | 2023.06.04 |