2010-03-30 4 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

+0

@ fl00r: это метод подсчета. После загрузки 'organisation' он делает то же, что и в моем примере. – klew

+0

klew, вы правы. Я смешал методы _length_ и _size_ – fl00r

2

В PostgreSQL вы не можете. Данные хранятся в блоках (обычно по 8 кбайт каждый), и вы не знаете, в каком блоке хранятся записи с «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

Это зависит от вашей структуры таблицы. Если у вас есть все поля с фиксированной шириной, вы можете приблизиться. Если у вас есть поля переменной ширины, лучше всего вы сделаете оценку. Это для 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 
Смежные вопросы