ActiveRecord查询中"包含"和"连接"之间有什么区别?

Mel*_*lon 19 ruby-on-rails ruby-on-rails-3

ActiveRecord查询中" 包含 "和" 连接 " 之间有什么区别?任何人都可以用以下两个相关模型向我解释?

class Car < ActiveRecord::Base
  belongs_to :store
end

class Store < ActiveRecord::Base
  belongs_to :owner
  has_one :car
end
Run Code Online (Sandbox Code Playgroud)

Mic*_*are 35

stores = Store.joins(:car)
Run Code Online (Sandbox Code Playgroud)

这将返回所有有车的商店.stores[0].car将导致另一个查询.

stores = Store.includes(:car)
Run Code Online (Sandbox Code Playgroud)

这将返回所有商店,汽车或没有汽车.stores[0].car不会导致另一个查询.

stores = Store.includes(:car).joins(:car)
Run Code Online (Sandbox Code Playgroud)

这将返回所有商店的汽车.stores[0].car不会导致另一个查询.我不会建议这种has_many关系,但它适用于has_one.


idl*_*ers 23

:joins在sql中连接表,:includes渴望加载关联以避免n + 1问题(执行一个查询以检索记录,然后每个加载一个关联).

我建议你阅读他们在Rails指南中的部分以获取更多信息.


Zac*_* Xu 5

:joins 返回只读对象,:includes 不返回

:joins 使用内连接, :includes 使用外连接。

:includes 的主要原因是预先加载,以避免使用单独查询加载每个对象的属性的 N+1 问题。