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