我试图弄清楚如何取消在相关表格中找到的查询中的记录。
我有3个表,User,Job和关联的表JobDenial。 JobDenial与User&amp ;;有一个belongs_to关系。工作。
我有一个正在进行的Job ActiveRecord有资格处理许多不同的事情,但我需要添加附加条件,以便忽略在JobDenial上找到job_id和当前user_id的作业。
我现在可以这样做:
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 :(得分: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(...)
希望有所帮助。
答案 1 :(得分: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)