Ruby

[RoR] ActiveRecord 의 count, length, size

강씨아저씨 2020. 6. 30. 11:28

오늘의 포스팅 내용은 "ActiveRecord의 length, count, size 의 차이를 간략히 알아보자" 이다.

Rails 로 기능 개발을 하면서 ActiveRecord Relation 의 Element 의 개수를 확인하기 위해 ActiveRecord 의 length, count, size 를 사용할 때가 있다. 우리는 다양한 방법으로 개수를 확인할 수 있지만 length, count, size 에는 조금씩 차이가 있으니 알고 사용하면 더 도움이 된다. 

 

count

count 는 ActiveRecord Relation 의 Element 의 수를 확인하기 위해서 SQL query 를 실행한다. 호출 시점에 Database 의 정확한 수를 확인할 수 있다는 점이 장점이지만 상황에 따라서 불필요하게 조회 쿼리가 한번 더 호출된다. 

# 전체 사용자를 조회해서 메모리에 load 한다.
users = Accounts::User.all.load

# 전체 사용자의 수를 확인한다. 
users.count
--- 실행 SQL ---
SELECT COUNT(*) FROM `users`
--- 실행결과 ---
32

 

length

length 는 메모리에 load 되어 있는 ActiveRecord Relation 의 Element 수를 반환한다. 불필요하게 조회 쿼리를 다시 호출하지 않는다는 장점이 있지만 load 된 이후에 추가된 데이터가 있을 경우 반영되지 않기 때문에 값이 부정확할 수 있다. 

# 전체 사용자를 조회해서 메모리에 load 한다.
users = Accounts::User.all.load

# users load 후에 신규 데이터 추가 
Accounts::User.create(name: 'new_user_after_load')

# 전체 사용자의 수를 확인한다. 
users.length
--- 실행 SQL ---
없음
--- 실행결과 ---
32

# count 로 DB 의 사용자 수를 확인한다. 
users.count
--- 실행 SQL ---
SELECT COUNT(*) FROM `users`
--- 실행결과 ---
33

 

size

size 는 위에서 확인한 length 와 count 의 조합으로 사용된다.  size 를 호출했을때 이미 메모리에 load 되어 있다면 length 가 동작할 것이고, 그렇지 않다면 count 가 호출될 것이다. 다음은 ActiveRecord Relation 의 size 함수의 내부 정의이다. 

module ActiveRecord
  class Relation
    ...
    # Returns size of the records.
    def size
      loaded? ? @records.length : count(:all)
    end
    ...

 

일반적으로 size 를 이용하면 여러 가지 상황에 대한 고려를 크게 하지 않아도 되기 때문에 유용하다고 본다.

 

오늘은 여기까지~

누군가에게 도움이 되었길 바라면서 오늘의 포스팅 끝~