programing

레일즈에서 플럭과 수집의 차이점은 무엇입니까?

telecom 2023. 6. 4. 10:18
반응형

레일즈에서 플럭과 수집의 차이점은 무엇입니까?

여기 두 개의 샘플 코드가 있습니다.

첫 번째는collect:

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

두 번째는 다음과 함께.pluck:

User.first.gifts.pluck(:id)

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

pluckDB 레벨에 있습니다.특정 필드만 쿼리합니다.이거 보세요.

다음 작업을 수행할 때:

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

모든 필드가 로드된 개체가 있으면 다음과 같은 정보를 얻을 수 있습니다.idEnumerable을 기반으로 한 방법 덕분입니다.

그래서:

  • 만약 당신이 필요하다면.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

반응형