RoR:ActiveRecord并取消与相关模型的资格

时间:2016-02-23 15:26:19

标签: ruby-on-rails activerecord

我试图弄清楚如何取消在相关表格中找到的查询中的记录。

我有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的地图。

2 个答案:

答案 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)