gpt4 book ai didi

ruby-on-rails - 依赖于 Ruby on Rails 关联类型的急切加载

转载 作者:行者123 更新时间:2023-12-04 01:05:16 24 4
gpt4 key购买 nike

我有一个多态关联( belongs_to :resource, polymorphic: true ),其中 resource可以是各种不同的型号。为了简化问题,假设它可以是 OrderCustomer .

如果是 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 加 1 问题:
SELECT "addresses".* WHERE "addresses"."order_id" = ...
SELECT "locations".* WHERE "locations"."customer_id" = ...
...

什么是解决这个问题的好方法?是否可以手动预加载关联?

最佳答案

您可以在 ActiveRecord::Associations::Preloader 的帮助下做到这一点类。这是代码:

@issues = Issue.all # Or whatever query
ActiveRecord::Associations::Preloader.new.preload(@issues.select { |i| i.resource_type == "Order" }, { resource: :address })
ActiveRecord::Associations::Preloader.new.preload(@issues.select { |i| i.resource_type == "Customer" }, { resource: :location })

您可以在过滤集合时使用不同的方法。例如,在我的项目中,我使用 group_by
groups = sale_items.group_by(&:item_type)
groups.each do |type, items|
conditions = case type
when "Product" then :item
when "Service" then { item: { service: [:group] } }
end

ActiveRecord::Associations::Preloader.new.preload(items, conditions)

您可以轻松地将此代码包装在某个帮助程序类中,并在应用程序的不同部分中使用它。

关于ruby-on-rails - 依赖于 Ruby on Rails 关联类型的急切加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com