新手问题 如何更好地取出关联表中的字段属性值?

Insub · 2018年12月18日 · 最后由 msg7086 回复于 2018年12月20日 · 1240 次阅读

我有一个 Project 模型和一个 User 模型,多对多关系。他们通过 has_many :through 用 ProjectUser 关联表来管理,在 ProjectUser 这个关联模型里,有一个 role 属性。

我的需求是:在查询 A 用户的所有 Projects 的时候,能同时获取到 A 用户对应某 Project 的 role 值。 目前我是这样查询的:

@projects = Project.includes(:project_users).where(:project_users => { :user_id => current_user.id } ).where('projects.updated_at > ?', someTime).where(deleted_at: nil)

这样取出来的 project 数据里就只会有一个当前用户的 project_user 记录,然后我就可以通过 project.project_users[0].role 去获取当前用户对于这个项目的权限了。而不需要再查找一遍 ProjectUser 表。

json.projects @projects do |project|
    json.id project.id
    json.name project.name
    json.role project.project_users[0].role
end

但总觉得这样的查询貌似有点怪,执行的 sql 也非常的长以及复杂。

请教,是否有更好的办法来实现这个需求?

select role 然后映射到 project instance 上

@projects = current_user.projects.select('projects.*, project_users.role as role')

json.projects @projects do |project|
    json.id project.id
    json.name project.name
    json.role project.role
end

@adamshen 谢谢。 但貌似多了很多 SQL 查询,从返回的毫秒数看似乎还变差了

Insub 回复

哈哈 SORRY 我不能解决 希望有别人能够帮助到你

用 ProjectUser 表作为主表来查询怎么样?

@project_users = current_user.project_users.includes(:projects).where(projects: {deleted_at: nil})

拍脑子纯手打没测试,仅供参考。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号