2016-02-23 2 views
0

Я пытаюсь выяснить, как дисквалифицировать записи в запросе, которые находятся в связанной таблице.RoR: ActiveRecord и дисквалификация со связанными моделями

У меня есть 3 таблицы, User, Job и связанная таблица JobDenial. JobDenial имеет отношение own_to с пользователем & Job.

У меня есть текущее задание ActiveRecord, которое квалифицируется на несколько разных вещей, но мне нужно добавить дополнительное условие, чтобы оно игнорировало задания, в которых job_id и текущий user_id находятся на JobDenial.

я могу сделать это в настоящее время, как:

job_ids = current_user.job_denials.map(&:job_id) 

jobs = Job.near(params[:zipcode], distance).where('active = true AND id NOT IN (?)', job_ids).select(:id).uniq 

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

+0

Я изменил бы 'карты (&: job_id)' на 'срывать (: job_id) ', и напишите' where' as: 'где (active: true) .where.not (id: job_ids)'. Но окончательно использовать такой же подход здесь. – BroiSatse

ответ

0

Я мог бы добавить несколько областей в Job похожего на:

scope :active, ->{ where(active: true) } 
scope :approved, -> { includes(:job_denials).where(job_denials: {id: nil}) } 

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

Job.active.approved 
current_user.jobs.active.approved.near(...) 

Надеюсь, что это поможет.

0

Ваш запрос будет:

jobs = Job.includes(:job_denials) 
      .where(active: true) 
      .where(job_denials: {job_id: nil}) 
      .near(params[:zipcode], distance) 

Если вы просто хотите, чтобы выбрать id от работы:

job_ids = Job.includes(:job_denials) 
      .where(active: true) 
      .where(job_denials: {job_id: nil}) 
      .near(params[:zipcode], distance) 
      .pluck(:id) 
Смежные вопросы