Запрос Activerecord, где текущий работодатель — X, а предыдущий работодатель — Y

По сути, я хотел бы вернуть всех людей, чья текущая должность 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)

конец

Любое направление было бы восхитительным. Спасибо!

Не уверен, но можете ли вы проверить, имеет ли следующий запрос нужный вам запрос: 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 в конце, если он создает нужный вам запрос.

raviture 11.12.2020 08:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас была правильная идея с двойным соединением 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") 

Это именно то, что я искал! Большое спасибо! В качестве следующего шага, как мне заставить это работать с массивом идентификаторов компаний, а не только с одним идентификатором компании? Еще раз спасибо!

Joel Velis 11.12.2020 19:45

@JoelVelis Я не уверен, каков ожидаемый результат. Для передачи массива в запрос можно сделать .where("jh2.company_id in (?)", [2,3]) или еще проще .where("jh2.company_id": [2,3]). Но этого может быть или не хватить в зависимости от ожидаемого результата.

Daniel Sindrestean 12.12.2020 15:04

Тоже именно то, что мне было нужно. Большое спасибо Даниил

Joel Velis 12.12.2020 19:05

Другие вопросы по теме