По сути, я хотел бы вернуть всех людей, чья текущая должность X и чья предыдущая должность Y. Например, у меня есть талант, чья текущая занятость «Airbnb (company_id = 1)» и чья предыдущая работа в « Ютуб (company_id = 2)".
Если я запущу запрос на поиск талантов там, где сейчас работает Airbnb:
Talent.joins(:job_histories).where(["job_histories.company_id = ? and job_histories.end_year = ?", 1, "Present"])
Я получаю человека.
Если я запускаю запрос, где предыдущее место работы — Youtube (отсюда end_year! = «Настоящее» ниже)
Talent.joins(:job_histories).where(["job_histories.company_id = ? and job_histories.end_year != ?", 2, "Present"])
Я тоже получаю такого же человека.
Однако, если я свяжу их вместе, чтобы найти таланты, где текущим работодателем является Airbnb, а предыдущим работодателем является Youtube, вот так:
@talents = Talent.all
@talents = @talents.joins(:job_histories).where(["job_histories.company_id = ? and job_histories.end_year = ?", 1, "Present"])
@talents = @talents.joins(:job_histories).where(["job_histories.company_id = ? and job_histories.end_year != ?", 2, "Present"])
Я не получаю никаких результатов. Я пробовал несколько вариантов запроса, но ни один из них ничего не возвращает.
Единственный способ заставить его работать — использовать первый запрос, а затем перебирать каждый талант, чтобы найти, где job_histories.company_id == 2.
if params[:advanced_current_company] && params[:advanced_previous_company]
@talents = @talents.joins(:job_histories).where(job_histories: { company_id: params[:advanced_current_company] }).distinct if params[:advanced_current_company]
@talents.each do |talent|
talent.job_histories.each do |job_history|
if job_history.company_id == params[:advanced_previous_company][0].to_i
new_talents.append(talent.id)
end
end
end
@talents = Talent.where(id: new_talents)
конец
Любое направление было бы восхитительным. Спасибо!
У вас была правильная идея с двойным соединением job_histories
, но вам нужно использовать псевдонимы имен таблиц job_histories
, чтобы иметь возможность различать их в запросе, иначе activerecord
будет думать, что нужно выполнить только одно соединение.
Talent.joins("INNER JOIN job_histories as jh1 ON jh1.talent_id = talents.id")
.joins("INNER JOIN job_histories as jh2 ON jh2.talent_id = talents.id")
.where("jh1.company_id = ? and jh1.end_year = ?", 1, "Present")
.where("jh2.company_id = ? and jh2.end_year != ?", 2, "Present")
Это именно то, что я искал! Большое спасибо! В качестве следующего шага, как мне заставить это работать с массивом идентификаторов компаний, а не только с одним идентификатором компании? Еще раз спасибо!
@JoelVelis Я не уверен, каков ожидаемый результат. Для передачи массива в запрос можно сделать .where("jh2.company_id in (?)", [2,3])
или еще проще .where("jh2.company_id": [2,3])
. Но этого может быть или не хватить в зависимости от ожидаемого результата.
Тоже именно то, что мне было нужно. Большое спасибо Даниил
Не уверен, но можете ли вы проверить, имеет ли следующий запрос нужный вам запрос:
Talent.joins(:job_histories).where(" (job_histories.company_id = ? and job_histories.end_year = ?) AND (job_histories.company_id = ? and job_histories.end_year != ?) ", 1, 'Present', 2, 'Present')
Кроме того, если это не работает, проверьте строку SQL, которую он генерирует, используя to_sql в конце, если он создает нужный вам запрос.