Rails过滤拥有并属于许多数据库

时间:2016-11-25 10:46:56

标签: ruby-on-rails ruby

我有一个拥有并属于许多工具的用户表。

因此每个用户可以拥有他们想要的任意数量的工具,并且工具可以与用户相关联。

我要做的是创建一个过滤系统,以便在我的主页面上,人们可以点击一系列工具,它只会显示与这些工具有关联的用户。

所以它需要只返回拥有某人选择的所有技能的用户,例如拥有Git和Jira,非git或Jira的人

我可以使用

为一个工具做到这一点
if params["Confluence"]
        contractors = contractors.includes(:tools).where(tools: { name: "Confluence" })
end

我尝试过做这样的事情

contractors = contractors.includes(:tools).where(tools: { name: "Confluence" , name: "Git", name: "JIRA Core" , name:"JIRA Software"})

但它只会使用列表中的最后一个工具返回用户。我也试过这样的

    if params["JIRA Core"]
        contractors = contractors.includes(:tools).where( tools: {name: "JIRA Core"})
    end

    if params["JIRA Software"]
        contractors = contractors.includes(:tools).where( tools: {name: "JIRA Software"})
    end

然而这也不起作用。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

查看

如果您需要承包商,至少应该使用其中一种工具

contractors.joins(:tools).where('tools.name IN (?) ', ['JIRA Core','Git']).uniq

OR 

contractors.joins(:tools).where('tools.name = ?', "JIRA Core").uniq

OR

当您需要承包商应该拥有所有工具

时就是这种情况

param_values = [' JIRA Core',' Git']

contractors.joins(:tools).where('tools.name IN (?) ', param_values).group('contractors.id').having('contractors.count = ?', param_values.count).uniq

答案 1 :(得分:0)

您的工具应该是用户选择的工具数组

single-client. php

通过查询每个工具来声明要推送的承包商数组

@tools = params[:tools]

并在视图模板中展平.each。

@contractors = []

@tools.each do |tool|
  @contractors << Contractor.includes(:tool).where(tools: {name: tool.name})
end
视图中的

@contractors.flatten!