2016-11-25 6 views
0

У меня есть таблица пользователей, которая имеет и принадлежит многим инструментам.Фильтрация Rails имеет и принадлежит ко многим базам данных

поэтому каждый пользователь может иметь столько инструментов, сколько захочет, и инструменты могут быть связаны с пользователем.

то, что я пытаюсь сделать, - это создать систему фильтров, чтобы на моей главной странице люди могли щелкнуть набор инструментов и отображать только тех пользователей, которые имеют связь с этими инструментами.

поэтому она должна навевает только пользователи, у которых есть все навыки, кто-то выбранным, например, кто-то, кто имеет 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

contractors.joins (инструменты): .где ('tools.name =?', "JIRA Core") –

ответ

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 
+0

То есть я ближе к результату мне нужно Спасибо, однако, что это делает, это вернуть экземпляр этого пользователя каждый раз, когда у него есть один из инструментов, любая идея, по которой я мог бы перейти отсюда? – Adear

+0

@Adear Да, он будет получать пользователей, имеющих один из инструментов .... так что вы можете получить дубликаты пользователей, так что вы можете использовать использование uniq –

+0

, я бы хотел, чтобы он отображал пользователей, у которых есть все эти инструменты, любая идея как это делается? – Adear

0

Вашего PARAMS инструментов должен быть массивом инструментов, которые выбираются пользователем

@tools = params[:tools] 

DECLARE подрядчики массив, к которому вы будете толкать, запрашивая для каждого инструмента

@contractors = [] 

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

и придавить делать. каждый в шаблонах представления.

@contractors.flatten! 

в соображениях:

<% @contractors.each do |contractor|%> 
    <p><%=contractor.name</p> 
<%end%> 
Смежные вопросы