Вы можете использовать быстрое объединение:
@customers = Customers.paginate :page => 1, :per_page => 20, :include => [:orders]
Указав параметр: include для объединения, заказы будут предварительно загружены, что предотвратит проблему n + 1.Затем вы можете использовать customer.orders.length.
Если загрузка всех этих заказов занимает слишком много памяти, вам следует изучить counter_cache
.Это разработано, чтобы вести подсчет модели в связанной модели:
class Order
belongs_to :customer, :counter_cache => true
end
Это будет увеличивать и уменьшать поле orders_count
в собственной записи customer
, когда заказы добавляются или удаляются из ассоциации.
Если вы не хотите использовать counter_cache, вам понадобится пользовательский искатель SQL, который объединяет таблицу заказов и группирует их по orders.customer_id, а затем выбирает счетчик в качестве дополнительного поля.Это не будет работать так же хорошо, как кеш счетчика.