Я бы добавил это как комментарий к верхнему ответу, но не могу по какой-то причине. Согласно этому посту:
http://m.onkey.org/active-record-query-interface
Метод User.all(options)
будет устаревшим после Rails 3.0.3 и заменен кучей других (удобных, цепных) активных типов записей, но из-за этого очень трудно понять, как собрать один и тот же вид запроса.
В результате я реализовал метод кэширования счетчиков. Это было довольно легко и безболезненно, за исключением того, что вам нужно помнить, чтобы обновить информацию о столбцах в вашей миграции, иначе все существующие записи будут иметь «0».
Вот что я использовал в своей миграции:
class AddUserCountToCollections < ActiveRecord::Migration
def self.up
add_column :collections, :collectionusers_count, :integer, :default => 0
Collection.reset_column_information
Collection.all.each do |c|
Collection.update_counters c.id, :collectionusers_count => c.collectionusers.count
end
end
def self.down
remove_column :collections, :collectionusers_count
end
end
В теории это тоже должно быть быстрее. Надеюсь, это будет полезно в будущем.