面试题答案
一键面试优化思路
- 减少查询次数:使用
includes
方法进行预加载,避免N + 1问题。在这种情况下,通过预加载订单表,可以在一次数据库查询中获取用户及其关联订单的数据,而不是为每个用户单独查询订单。 - 添加索引:在订单表的
user_id
字段和created_at
字段(用于获取最近订单)上添加索引,以加快查询速度。 - 限制查询字段:只选择需要的字段,减少数据传输量。
Ruby on Rails代码片段
假设我们有 User
模型和 Order
模型,并且它们之间有正确的关联关系(User has_many :orders
,Order belongs_to :user
)。
# 添加索引
class AddIndexToOrders < ActiveRecord::Migration[6.0]
def change
add_index :orders, :user_id
add_index :orders, :created_at
end
end
# 获取每个用户及其最近的订单信息
users_with_recent_orders = User.includes(:orders).map do |user|
recent_order = user.orders.order(created_at: :desc).first
{ user: user, recent_order: recent_order }
end
在上述代码中:
- 首先通过迁移文件添加了必要的索引。
- 然后在代码中使用
includes
方法预加载用户关联的订单。接着通过map
方法遍历每个用户,并获取该用户按created_at
降序排列的第一个订单(即最近订单)。最终返回一个包含用户及其最近订单信息的数组。