2010-03-30 8 views

답변

1

다음과 같이 당신이 당신의 모델에서 설정 협회가있는 경우 :

organisation = Organisation.find(1) 
n_members = organisation.members.size 
:

class Organisation < ActiveRecord::Base 
    has_many :members 
end 

class Member < ActiveRecord::Base 
    belongs_to :organisation 
end 

는 다음 다음과 같이 조직 1에서 얼마나 많은 회원 찾을 수 있습니다

ActiveRecord 덕분에 이런 종류의 것은 데이터베이스 독립적입니다.

+0

카운트 방법은 훨씬 빠릅니다. – fl00r

+0

@ fl00r : 카운트 방법입니다. 'organisation '을 로딩 한 후에도 나의 예제와 똑같은 일을합니다. – klew

+0

klew, 네 말이 맞아. _length_ 및 _size_ 메서드를 혼합했습니다. – fl00r

2

PostgreSQL에서는 사용할 수 없습니다. 데이터는 블록 (일반적으로 각각 8kb)에 저장되며 "organisation_id = 1"인 레코드가 어떤 블록에 저장되어 있는지 전혀 알 수 없습니다. 모든 레코드가 하나의 블록에 있으면 8kb입니다. 100 개의 레코드가 100 개의 블록에 저장되면 800kb이지만 다른 레코드도 포함됩니다.

숨겨진 열 "ctid"로 일부 마법을 쓸 수도 있지만 이는 정확하지 않고별로 유용하지 않은 많은 작업입니다. 전체 테이블을 얻으려면 pg_relation_size()를 사용하면된다. TOAST 테이블 인클루드가 필요하면 pg_total_relation_size()를 사용하십시오.

2
ModelName.count(:conditions => {:organisation_id => 1}) 
+0

이것이 간단한 해결책 일 수 있다고 생각합니다. 그런 다음 각 열에 필요한 바이트 수를 곱할 수 있습니다. –

+0

흠, 내 대답이 잘못되었습니다. 그것은 테이블 크기를 제공하지 않지만 테이블의 행을 계산합니다. – klew

+0

하지만 ... 'conditional_table_size = rows * row_size' – Randolpho

0

비록 짧은 버전

ModelName.count(:organisation_id => 1) 
1

그것은 당신의 테이블 구조에 따라 달라집니다. 너비가 고정 된 필드를 모두 가지고 있으면 꽤 가까워 질 수 있습니다. 가변 너비 필드가있는 경우 가장 잘 수행 할 수 있습니다. 이것은 포스트그레스 용입니다.

SELECT pg_total_relation_size('my_table') * i/cnt 
FROM (
    SELECT SUM(CASE WHEN organization_id = 1 THEN 1 ELSE 0 END) AS i, 
    COUNT(1) AS cnt 
    FROM my_table 
) sub 
관련 문제