gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 模型范围与 has_many 关联的连接

转载 作者:数据小太阳 更新时间:2023-10-29 08:31:28 28 4
gpt4 key购买 nike

我目前正在我的 Rails 模型中设置一个范围,以供 ActiveAdmin 使用。我要构建的范围应该找到过去有 survey_date 的每个 Job,有 Job.survey 存在,没有 Job.quotes 出现。

这是我的 Job 模型的简化版本:

has_many :quotes
has_many :surveys

scope :awaiting_quote, lambda { joins(:surveys, :quotes).where('survey_date < :current_time AND surveys.id IS NOT NULL AND quotes.id IS NULL', { current_time: Time.current }) }

我应该如何更改我的范围,以便它正确地找到相关的 Job 记录?

最佳答案

Rails 5 更新

作为mad_raz提到,在 Rails 5.0+ 中,您可以使用 left_outer_joins :

scope :awaiting_quote, -> { joins(:surveys).
left_outer_joins(:quotes).
where('survey_date < :current_time', { current_time: Time.current }).
where('quotes.id IS NULL')
}

但是,您仍然必须提供 where('quotes.id IS NULL') 检查以仅返回那些尚未收到报价的记录。参见 https://stackoverflow.com/a/16598900/1951290以获得外部联接的出色视觉表示。

将它们分成两个独立的范围可能仍然是最有意义的。


rails 4

您可以使用 joins 创建左外连接,您只需要更明确一点即可。

scope :awaiting_quote, -> { joins(:surveys).
joins('LEFT OUTER JOIN quotes ON quotes.job_id = jobs.id').
where('survey_date < :current_time', { current_time: Time.current }).
where('quotes.id IS NULL')
}

您不需要surveys.id IS NOT NULL,因为成功的内部联接不会包含 nil id。

将它们分成两个单独的范围可能更有意义,:has_survey:without_quote,然后可以将它们组合成一个方法。

def self.awaiting_quote
Job.has_survey.without_quote
end

关于ruby-on-rails - Rails ActiveRecord 模型范围与 has_many 关联的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30330381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com