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