【发布时间】:2020-05-17 07:58:21
【问题描述】:
我想提高我的一个端点的效率。这是纲要:
在一个 mysql 数据库中,我们有三个示例表,其中两个是第一个的连接表。
:user has_many: :orders
:user has_many: :attributes
后续查询很简单(但可能会发生变化):
User.left_joins(:orders, :attributes).select("users.*, orders.*, attributes.*")
此查询返回大对象,对于每个用户、存在的订单或属性,它返回一个平面对象。
[
{
User:
id: 1,
order_id: 1,
order_columns_here,
attribute_id: 1,
attribute_columns_here
},
{
User:
id: 1,
order_id: 2,
order_columns_here,
attribute_id: 2,
attribute_columns_here
}
]
结果是一个相同用户数据的数组,每个订单或与其关联的属性重复多次。
如果我必须编写一些 ruby 来按照 API 请求的方式格式化这个对象,它会很慢(我们有一个巨大的数据库)。是否有一种活动记录方法可用于扩充此查询,以便返回数据以及数组中的所有照片和 floor_plans?
即
[
{
User: id: 1, orders: [all_order_data_for_user_1], attributes: [all_attributes_data_for_user_1]
}
]
在过去的几年里,我一直在使用 Sequel gem,它为我做到了这一点。我已经阅读了很多 AR 文档,但不确定 ActiveRecord 世界对我有什么帮助。
有什么想法吗?
编辑
mysql版本:mysql Ver 14.14 Distrib 5.7.29 导轨:5 红宝石:2.3.1
【问题讨论】:
-
你打算如何使用结果?您可以使用
.includes代替.left_joins,它会预加载关系。
标签: mysql ruby activerecord ruby-on-rails-5