侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

关联模型中的 include 方法

barwe
2021-11-18 / 0 评论 / 0 点赞 / 840 阅读 / 799 字
温馨提示:
本文最后更新于 2022-07-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在模型类上使用 includes 方法,可以使结果集中的实例对象通过属性的方式直接访问指定关系模型中的关联对象,例如

users = User.includes(:address)
users.each do |user|
    user.address.city
end

在上面的例子中

  • users 是查询的结果集,它是与数据表中每条记录等价的一组 Ruby 对象

  • User 是 Ruby 中定义的 模型 或者叫 关系,它是一个

  • :address 是模型 User 上定义的一个属性,它也是联系两个关系之间的纽带。这里 UserAddress 应该是一对一或者多对一的关系,这样才能保证一个 User 实例只对应一个 Address 实例,但是一个 Address 实例对应的 User 实例数目是不确定的,所以在 User 的定义中应该有这么一条:

    class User < ApplicationRecord
        belongs_to :address
    end
    

    belongs_to 说明 UserAddress 之间多对一的关系。

  • 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)
0

评论区