在模型类上使用 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)
评论区