Ruby on rails 什么';这两者之间的区别是什么;包括「;及;加入;在ActiveRecord查询中?
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
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
,而无需启动新查询