Ich habe eine polymorphe Zuordnung (belongs_to :resource, polymorphic: true
), wobei resource
eine Vielzahl von verschiedenen Modellen sein kann. Zur Vereinfachung der Frage sei angenommen, dass es sich entweder um eine Order
oder eine Customer
handeln kann.Eager Last je nach Art der Verbindung in Ruby on Rails
Wenn es eine Order
ist, möchte ich die Bestellung vorab laden und die Address
vorladen. Wenn es ein Kunde ist, möchte ich die Customer
vorladen und die Location
laden.
Der Code dieser Assoziationen mit tut so etwas wie:
<%- @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 -%>
Derzeit meine Vorspannung verwendet:
@issues.preload(:resource)
jedoch nach wie vor n-plus-eins-Ausgaben Ich sehe die bedingten Assoziationen zum Laden:
SELECT "addresses".* WHERE "addresses"."order_id" = ...
SELECT "locations".* WHERE "locations"."customer_id" = ...
...
Was ist ein guter Weg, um das zu beheben? Ist es möglich, eine Assoziation manuell vorzuladen?
Ich verwende polymorphe Assoziationen nicht länger aus Gründen wie dem Problem, dem Sie gegenüberstehen. (Sie machen auch Datenintegrität schwieriger). –
Schienen ist ziemlich intelligent. Hast du '@ issues.preloads probiert (resouce: [: location,: address])' '? –
@MarcRohloff es löst eine Ausnahme 'ActiveRecord :: AssociationNotFoundError' aus. Sieht nicht so aus, als würde das funktionieren (obwohl eine solche Syntax ideal wäre). – Stussa