一、Preload
- Preload 总是分表查询(preload 括号后跟几个关联对象他就会生成几条附加的查询语句),是includes 默认加载数据的方式。
- 是一种预加载关联表数据到内存的方式。
- 可以解决N+1问题
Order.preload(:order_items)
SELECT "orders".* FROM "orders"
SELECT "order_items".* FROM "order_items" WHERE "order_items"."order_id" IN ($1, $2, $3, $4, $5, $6, $7) [["order_id", 48], ["order_id", 44], ["order_id", 45], ["order_id", 46], ["order_id", 47], ["order_id", 49], ["order_id", 50]]
- 由于 preload 不会建立表之间的关联,总是生成多条sql,所以不能在后面对关联表使用 where 查询或者order排序
Order.preload(:order_items).where('order_items.status = 1')
Order.preload(:order_items).where(order_items: {
status: 1 } )
- preload 的 where 条件只能对主表使用
Order.preload(:order_items).where('orders.status = 1')
SELECT "orders".* FROM "orders" WHERE "orders"."status" = $1 [["status", 1]]
SELECT "order_items".* FROM "order_items" WHERE "order_items"."order_id" IN ($1, $2) [["order_id", 44], [