Собрать много «единиц» в одном запросе? - PullRequest
1 голос
/ 09 сентября 2010

Мне нужно сделать следующее:

<% for customer in @customers do %>
  <%= customer.orders.count %>
<% end %>

Это напрягает сервер, создавая n запросов, где n = количество клиентов.

Как я могу загрузить эти данные вместе со своими клиентами в одном запросе? Спасибо.

1 Ответ

2 голосов
/ 09 сентября 2010

Вы можете использовать быстрое объединение:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...