Ruby on rails 什么';这两者之间的区别是什么;包括「;及;加入;在ActiveRecord查询中?

Ruby on rails 什么';这两者之间的区别是什么;包括「;及;加入;在ActiveRecord查询中?,ruby-on-rails,ruby-on-rails-3,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 class-Car

ActiveRecord查询中的“包含”和“连接”之间有什么区别?有人能用以下两个相关模型向我解释一下吗

class Car < ActiveRecord::Base
  belongs_to :store
end

class Store < ActiveRecord::Base
  belongs_to :owner
  has_one :car
end
class-Car
:在sql中将表联接在一起,
:包括
急切加载关联以避免n+1问题(执行一个查询以检索记录,然后每个加载的关联一个查询)


我建议您阅读他们的部分以获得更多信息。

联接只会联接表,并返回所选字段。若对联接查询结果调用关联,它将再次触发数据库查询

Include将加载包含的关联并将它们添加到内存中。Include加载所有包含的表属性。如果您在include查询结果上调用关联,它将不会触发任何查询


你可以在我的这篇文章中找到一个详细的解释和例子:。

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

:joins使用内部联接,:includes使用外部联接

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

stores = Store.joins(:car)
这将返回所有有车的商店<代码>存储[0]。car
将导致另一个查询

stores = Store.includes(:car)
stores = Store.includes(:car).joins(:car)
这将退还所有商店,无论有车还是没有车<代码>存储[0]。car不会导致另一个查询

stores = Store.includes(:car)
stores = Store.includes(:car).joins(:car)
这将返回所有商店的汽车<代码>存储[0]。car不会导致另一个查询。我不推荐这一点,因为
有很多关系,但它对
有一个关系非常有效;博士

加入:

a.joins(:b).to_sql
=> "SELECT \"a\".* FROM \"a\" INNER JOIN \"b\" ON \"b\".\"id\" = \"a\".\"b_id\""
包括:

a.includes(:b).to_sql
=> "SELECT \"a\".* FROM \"a\"
两者:


:joins
是连接的ActiveRecord版本,即SQL请求

Store.joins(:car).to_sql
=> SELECT stores.* FROM stores INNER JOIN cars ON cars.store_id = categories.id
因此,在seed后面是一个隐式的
内部连接。因此,它确实会返回所有拥有汽车的商店(由于
内部连接
,因此
左侧连接
将具有不同的行为)。看更多

:includes
不是查询命令。它通过
eager\u在商店模型上加载
汽车模型来解决n+1查询问题。查看更多的
eager\u加载

因此将返回所有存储,并允许执行
stores.first.car
,而无需启动新查询