我有一个拥有并属于许多工具的用户表。
因此每个用户可以拥有他们想要的任意数量的工具,并且工具可以与用户相关联。
我要做的是创建一个过滤系统,以便在我的主页面上,人们可以点击一系列工具,它只会显示与这些工具有关联的用户。
所以它需要只返回拥有某人选择的所有技能的用户,例如拥有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
然而这也不起作用。有人有什么想法吗?
答案 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!