[ruby on rails] preload、includes、eager_load、joins

一、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 } ) # 用hash也不行
 # => PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "order_items"
  • 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], [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值