Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 具有多个过滤器的过滤器模型具有多个直通_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 具有多个过滤器的过滤器模型具有多个直通

Ruby on rails 3 具有多个过滤器的过滤器模型具有多个直通,ruby-on-rails-3,Ruby On Rails 3,给定 文件: has_many :shares has_many :groups, :through => :shares 用户: 组: has_many :memberships has_many :users, :through => :memberships has_many :shares has_many :documents, :through => :shares 我只需要显示用户的给定实例,即当前用户的文档 @documents=current_user.

给定

文件:

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

组:

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

has_many :shares
has_many :documents, :through => :shares
我只需要显示用户的给定实例,即当前用户的文档

@documents=current_user.groups.documents
不会剪切它


我如何才能筛选出与用户至少有相同组的文档?

您可以通过一个查询完成此操作:

Document.includes(:shares => { :group => :users }).where('users.id' => current_user.id)
生成的SQL(对于当前用户id=1):

请注意,通过使用而不是,只返回不同的结果(因此无需对结果调用
uniq
)。请参阅:

关于

docs = []
current_user.groups.uniq.each do |group|
   docs << group.documents
end
docs
docs=[]
当前_user.groups.uniq.each do|组|

docs这种方法的问题是,如果一个文档与用户有两个相同的组,它会输出该文档两次。在末尾添加.uniq可以解决这个问题,但我不确定这是获得结果的最佳方式。无论如何,谢谢你的意见!我同意以一种更干净的方式来做这件事是很好的,但是性能方面的关键问题是它对数据库的查询是什么。使用这种方法,您可以得到两个,首先查找与
当前用户关联的组(通过
成员身份
),然后选择具有这些组的所有文档(通过
共享
)。这是获得所需结果所需的最低要求。更新了我的答案:您可以通过单个DB查询来实现这一点。
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
docs = []
current_user.groups.uniq.each do |group|
   docs << group.documents
end
docs