ROR의 특정 필드에 고유한 값이 있는 레코드 수를 어떻게 계산할 수 있나요?

StackOverflow https://stackoverflow.com/questions/36608

문제

날짜 필드를 포함하는 레코드 세트가 있고 레코드 세트에 표시되는 고유 날짜 수를 확인하고 싶습니다.

다음과 같은 것 :

Record.find(:all).date.unique.count 

하지만 물론 그것은 작동하지 않는 것 같습니다.

도움이 되었습니까?

해결책

당신이하려는 것은 다음 SQL입니다.

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord에는 다음이 내장되어 있습니다.

Record.count('date', :distinct => true)

다른 팁

이는 레일 4 이상에서 약간 변경되었습니다. :distinct => true 이제 더 이상 사용되지 않습니다.사용:

Record.distinct.count('date')

또는 날짜와 번호를 원하는 경우:

Record.group(:date).distinct.count(:date)

SQL 외부:

Record.find(:all).group_by(&:date).count

ActiveSupport의 열거 가능#group_by 필수 불가결합니다.

최신 #count 온 레일 소스 코드에서는 1개의 매개변수만 허용합니다.보다: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

그래서 나는 다음과 같이 요구 사항을 달성했습니다.

Record.count('DISTINCT date')

답변을 자세히 설명하면 다음과 같습니다.

Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 1, :created_on => '2010-09-29')
Post.create(:user_id => 2, :created_on => '2010-09-29')
Post.create(:user_id => null, :created_on => '2010-09-29')

Post.group(:created_on).count
# => {'2010-09-29' => 4}

Post.group(:created_on).count(:user_id)
# => {'2010-09-29' => 3}

Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3
Post.group(:created_on).distinct.count(:user_id) # Rails = 4
# => {'2010-09-29' => 2}

내가 말했듯이 여기, Rails 4에서 다음을 사용하여 (...).uniq.count(:user_id) 다른 답변(이 질문 및 다른 SO의 다른 답변)에서 언급했듯이 실제로 추가로 이어질 것입니다. DISTINCT 쿼리 중 :

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

우리가 실제로 해야 할 일은 SQL 문자열을 직접 사용하는 것입니다.

(...).count("DISTINCT user_id")

이는 우리에게 다음을 제공합니다.

SELECT COUNT(DISTINCT user_id) FROM ...

또한 DB의 필드에 인덱스가 있는지 확인하십시오. 그렇지 않으면 해당 쿼리가 빠르게 느려질 것입니다.

(SQL에서 이 작업을 수행하는 것이 훨씬 낫습니다. 그렇지 않으면 개수에 응답하기 위해 전체 DB 테이블을 메모리로 끌어옵니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top