多个过滤模型有很多通过

时间:2012-11-22 13:46:28

标签: ruby-on-rails-3

鉴于

文件:

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

我只需要显示User,current_user的给定实例的文档。

@documents = current_user.groups.documents没有削减它。

如何才能过滤到至少与用户共同拥有的文档?

2 个答案:

答案 0 :(得分:1)

您可以使用一个查询执行此操作:

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

生成的SQL(适用于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)。请参阅:Distinct Join Rails

答案 1 :(得分:0)

怎么样?
docs = []
current_user.groups.uniq.each do |group|
   docs << group.documents
end
docs