具有多个过滤器模型有许多通过 [英] Filter model with multiple has many through

查看:34
本文介绍了具有多个过滤器模型有许多通过的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定

文档:

has_many :shares
has_many :groups, :through => :shares

用户:

has_many :memberships
has_many :groups, :through => :memberships

组:

has_many :memberships
has_many :users, :through => :memberships

has_many :shares
has_many :documents, :through => :shares

我只需要显示给定用户 current_user 实例的文档.

I need to show only documents for a given instance of User, current_user.

@documents = current_user.groups.documents 没有删减.

如何筛选出与用户至少有一个共同点的文档?

How can i filter down to only the documents that have at least on group in common with the user?

推荐答案

您可以通过一个查询来做到这一点:

You can do this with a single query:

Document.includes(:shares => { :group => :users }).where('users.id' => current_user.id)

生成的 SQL(对于 current_user.id = 1):

Generated SQL (for current_user.id = 1):

SELECT "documents"."id" AS t0_r0, "documents"."created_at" AS t0_r1,
  "documents"."updated_at" AS t0_r2, "shares"."id" AS t1_r0,
  "shares"."group_id" AS t1_r1, "shares"."document_id" AS t1_r2,
  "shares"."created_at" AS t1_r3, "shares"."updated_at" AS t1_r4,
  "groups"."id" AS t2_r0, "groups"."created_at" AS t2_r1,
  "groups"."updated_at" AS t2_r2, "users"."id" AS t3_r0,
  "users"."created_at" AS t3_r1, "users"."updated_at" AS t3_r2
  FROM "documents"
  LEFT OUTER JOIN "shares" ON "shares"."document_id" = "documents"."id"
  LEFT OUTER JOIN "groups" ON "groups"."id" = "shares"."group_id"
  LEFT OUTER JOIN "memberships" ON "memberships"."group_id" = "groups"."id"
  LEFT OUTER JOIN "users" ON "users"."id" = "memberships"."user_id"
  WHERE "users"."id" = 1

请注意,通过使用 includes 而不是 joins,只返回不同的结果(所以不需要对结果调用 uniq).请参阅:不同的连接导轨

Note that by using includes instead of joins, only distinct results are returned (so no need to call uniq on the result). See: Distinct Join Rails

这篇关于具有多个过滤器模型有许多通过的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆