Этот вызов activerecord должен делать то, что вы хотите:
Article.find(:all, :select => 'articles.*, count(posts.id) as post_count',
:joins => 'left outer join posts on posts.article_id = articles.id',
:group => 'articles.id'
)
Это вернет список объектов статьи, каждый из которых имеет метод post_count
, который содержит количество постов в статье в виде строки.
Метод выполняет sql, подобный следующему:
SELECT articles.*, count(posts.id) AS post_count
FROM `articles`
LEFT OUTER JOIN posts ON posts.article_id = articles.id
GROUP BY articles.id
Если вам интересно, это пример результатов MySQL, которые вы можете увидеть при выполнении такого запроса:
+----+----------------+------------+
| id | text | post_count |
+----+----------------+------------+
| 1 | TEXT TEXT TEXT | 1 |
| 2 | TEXT TEXT TEXT | 3 |
| 3 | TEXT TEXT TEXT | 0 |
+----+----------------+------------+