在模型类上使用 includes 方法,可以使结果集中的实例对象通过属性的方式直接访问指定关系模型中的关联对象,例如
users = User.includes(:address)
users.each do |user|
user.address.city
end
在上面的例子中
-
users是查询的结果集,它是与数据表中每条记录等价的一组 Ruby 对象 -
User是 Ruby 中定义的 模型 或者叫 关系,它是一个 类 -
:address是模型User上定义的一个属性,它也是联系两个关系之间的纽带。这里User和Address应该是一对一或者多对一的关系,这样才能保证一个User实例只对应一个Address实例,但是一个Address实例对应的User实例数目是不确定的,所以在User的定义中应该有这么一条:class User < ApplicationRecord belongs_to :address end用
belongs_to说明User和Address之间多对一的关系。 -
users本质上相当于一个数组,因此可以使用each方法对其迭代 -
user.address引用的是与之关联的某个Address实例
includes 使我们不需要对目标实例关联的其他关系做额外的查询,这可以提升处理简单连接的效率。
可以用来指定多个关系,例如:
users = User.includes(:address, :friends)
可以嵌套使用,例如:
users = User.includes(:address, friends: [:address, :followers])
条件查询
通过 includes 指定的关系不能直接用于后面的条件查询。
在where中使用关系实例需要使用 references 显式声明依赖的关系属性。
User.includes(:posts).where('posts.name = ?', 'example').references(:posts)
评论区