SQL查询过滤记录

时间:2014-09-03 18:02:24

标签: sql ruby ruby-on-rails-4

我正在处理一个查询,以显示未授予的Jobquotes(awarded: false)。 下面的代码运行良好,但我有其他Jobquotes被授予(awarded: true)相同的job.id.我想知道是否有办法过滤结果以删除任何具有相同job.id的Jobquotes,其中一个被授予。

  • 一份工作有很多Jobquotes
  • Jobquotes是Jobs和Quotes之间的连接表
  • awarded位于Jobquotes

    x = Jobquote.select('*, (total_cost/quote_qty) AS cost_each')
    .includes(job: [:part], quote: [:vendor])
    .where(awarded: false)
    .where.not("quotes.quote_number" => nil)
    .order("parts.number, cost_each")
    .group(:quote_id, "parts.number")
    

1 个答案:

答案 0 :(得分:2)

你可以尝试这样的事情:(请注意我觉得有更好的方法可以做到这一点,现在就想不出任何事情)

class Jobquote < ActiveRecord::Base
  belongs_to :job
  belongs_to :quote
  scope :awarded_job_quotes, ->{ where(awarded: true)}
  scope :open_job_quotes, -> {
        awarded_job_ids = awarded_job_quotes.pluck(:job_id)
        where.not(job_id: awarded_job_ids)
        }
  scope :display_open_job_quotes, -> {
        open_job_quotes.select('*, (total_cost/quote_qty) AS cost_each')
        .includes(job: [:part], quote: [:vendor])
        .where.not("quotes.quote_number" => nil)
        .order("parts.number, cost_each")
        .group(:quote_id, "parts.number")
        }
end

然后您可以调用

 Jobquote.display_open_job_quotes

这样做的目的是查找所有获奖作业,然后通过job_id从查询中排除所有这些作业。然后我创建了一个scopedisplay_open_job_quotes)来返回请求的数据,因为我觉得像这样的长查询链可能会分散控制器的注意力。

注意:这将运行其他查询以获取初始job_ids