我正在处理一个查询,以显示未授予的Jobquotes(awarded: false
)。
下面的代码运行良好,但我有其他Jobquotes被授予(awarded: true
)相同的job.id.我想知道是否有办法过滤结果以删除任何具有相同job.id的Jobquotes,其中一个被授予。
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")
答案 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
从查询中排除所有这些作业。然后我创建了一个scope
(display_open_job_quotes
)来返回请求的数据,因为我觉得像这样的长查询链可能会分散控制器的注意力。
注意:这将运行其他查询以获取初始job_ids
。