2010-03-30 52 views

回答

1

如果你在你的模型建立的社團如下:

class Organisation < ActiveRecord::Base 
    has_many :members 
end 

class Member < ActiveRecord::Base 
    belongs_to :organisation 
end 

然後你可以找到有多少個成員在組織1下列要求:

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

感謝ActiveRecord,這種事情是獨立於數據庫的。

+0

計數方法會快很多 – fl00r 2010-03-30 20:31:00

+0

@ fl00r:這是計數方法。加載'organisation'後,它和我的例子一樣。 – klew 2010-03-30 21:50:39

+0

klew,你說得對。我已經混淆了_length_和_size_方法 – fl00r 2010-03-30 22:41:27

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

我認爲這可能是一個簡單的解決方案,然後我可以乘以它需要的每個列的字節數 – 2010-03-31 02:54:00

+0

嗯,我thnik,我的答案是錯誤的。它不會給出表的大小,但它會計算表中的行數。 – klew 2010-03-31 10:53:36

+0

但是......'conditional_table_size = rows * row_size' – Randolpho 2010-03-31 21:21:08

0

甚至更​​短的版本

ModelName.count(:organisation_id => 1) 
1

這取決於你的表結構。如果你有所有固定寬度的字段,你可以非常接近。如果你有寬度可變的字段,你會做的最好的就是估計。這是爲postgres。

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