Вместо ускорения с помощью предварительной загрузки, я думаю, что проблема скорости лучше решается с помощью этого метода и рельсового кеширования.

я полиморфная ассоциация (belongs_to :resource, polymorphic: true) гдеresource Может быть множество разных моделей. Для упрощения вопроса предположим, что это может бытьOrder илиCustomer.

Если этоOrder Я хотел бы предварительно загрузить заказ и предварительно загрузитьAddress, Если это клиент, я хотел бы предварительно загрузитьCustomer и предварительно загрузитьLocation.

Код, использующий эти ассоциации, делает что-то вроде:

<%- @issues.each do |issue| -%>
<%- case issue.resource -%>
<%- when Customer -%>
<%= issue.resource.name %> <%= issue.resource.location.name %>
<%- when Order -%>
<%= issue.resource.number %> <%= issue.resource.address.details %>
<%- end -%>

В настоящее время моя предварительная загрузка использует:

@issues.preload(:resource)

Однако я все еще вижу проблемы n-plus-one для загрузки условных ассоциаций:

SELECT "addresses".* WHERE "addresses"."order_id" = ...
SELECT "locations".* WHERE "locations"."customer_id" = ...
...

Какой хороший способ это исправить? Можно ли вручную предварительно загрузить ассоциацию?

Ответы на вопрос(6)

Ваш ответ на вопрос