Вместо ускорения с помощью предварительной загрузки, я думаю, что проблема скорости лучше решается с помощью этого метода и рельсового кеширования.
я полиморфная ассоциация (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" = ...
...
Какой хороший способ это исправить? Можно ли вручную предварительно загрузить ассоциацию?