如何使用 Sequel Ruby gem 从急切图关联中急切加载关联?
How to eager load an association from a eager graph association using Sequel Ruby gem?
我的应用程序中有以下模型:
class Order < Sequel::Model
many_to_one(:client, class: 'Client', key: :client_id)
end
class Client < Sequel::Model
one_to_many(:images, class: 'Image', key: :client_id, eager: :file)
end
class Image < Sequel::Model
many_to_one(:file, class: 'File', key: :file_id, eager: :namespace)
end
class File < Sequel::Model
many_to_one(:namespace, class: 'Namespace', key: :namespace_id)
end
class Namespace < Sequel::Model
end
我可以使用 eager_graph 为所有 Clients
和 account_id=1
获取所有 Orders
(eager_graph 因为搜索列在 client
table):
orders = Order.eager_graph(:client).where(account_id: 1)
急切加载所有这些实体的最佳策略是什么?
如果我将其更改为 .eager_graph(client: :images)
,结果将是一个包含大量连接的大型查询。
是否可以对每个嵌套关联进行单独查询,就像只使用 .eager
方法一样?
由于性能问题,我试图对其进行微调。
提前致谢。
Sequel 目前不支持以这种方式混合 eager 和 eager_graph。你可以这样做:
Order.eager(:client=>{proc{|ds| ds.where(:account_id=>1)}=>:images}).all.
select{|order| order.client}
但如果大多数订单没有该客户,那可能效率不高。你最好这样做:
clients = Client.where(:account_id=>1).eager(:orders, :images)
clients.flat_map(&:orders)
我的应用程序中有以下模型:
class Order < Sequel::Model
many_to_one(:client, class: 'Client', key: :client_id)
end
class Client < Sequel::Model
one_to_many(:images, class: 'Image', key: :client_id, eager: :file)
end
class Image < Sequel::Model
many_to_one(:file, class: 'File', key: :file_id, eager: :namespace)
end
class File < Sequel::Model
many_to_one(:namespace, class: 'Namespace', key: :namespace_id)
end
class Namespace < Sequel::Model
end
我可以使用 eager_graph 为所有 Clients
和 account_id=1
获取所有 Orders
(eager_graph 因为搜索列在 client
table):
orders = Order.eager_graph(:client).where(account_id: 1)
急切加载所有这些实体的最佳策略是什么?
如果我将其更改为 .eager_graph(client: :images)
,结果将是一个包含大量连接的大型查询。
是否可以对每个嵌套关联进行单独查询,就像只使用 .eager
方法一样?
由于性能问题,我试图对其进行微调。
提前致谢。
Sequel 目前不支持以这种方式混合 eager 和 eager_graph。你可以这样做:
Order.eager(:client=>{proc{|ds| ds.where(:account_id=>1)}=>:images}).all.
select{|order| order.client}
但如果大多数订单没有该客户,那可能效率不高。你最好这样做:
clients = Client.where(:account_id=>1).eager(:orders, :images)
clients.flat_map(&:orders)