【问题标题】:Sort records based on association (has_many through) column根据关联(has_many through)列对记录进行排序
【发布时间】:2020-04-16 17:41:14
【问题描述】:

我面临一个问题,我必须根据 job_trade_contractors 的 min time_out 字段对作业进行排序。 job_trade_contractors 的 time_out 字段可能为 nil。我有这样的关联:

1:job.rb

has_many :job_trades, dependent: :destroy
has_many :job_trade_contractors, through: :job_trades

2:job_trade.rb

has_many :job_trade_contractors, dependent: :destroy

3:job_trade_contractors.rb

belongs_to :job_trade, touch: true

目前,我正在通过此代码对作业应用排序:

Job.left_joins(:job_trade_contractors).order("job_trade_contractors.time_out asc")

它根据 time_out 正确地对作业进行排序,但我需要的是对 job_trade_contractors 属于特定作业的最小超时值进行排序。

假设我们有 2 个工作,每个工作有 5 个 job_trade_contractors。我们需要根据关联的 job_trade_contractors 中的最小超时值对作业进行排序。

示例 工作

j1 -> 1: job_trade_contractor -> id: 1 time_out: 21-01-2020 2: job_trade_contractor -> id: 2 time_out: 20-01-2020 3: job_trade_contractor -> id: 3 time_out: 11-01-2020 4: job_trade_contractor -> id: 4 time_out: 19-01-2020 5: job_trade_contractor -> id: 5 time_out: 23-01-2020 j2 -> 1: job_trade_contractor -> id: 1 time_out: 21-01-2020 2: job_trade_contractor -> id: 2 time_out: 20-01-2020 3: job_trade_contractor -> id: 3 time_out: 11-01-2020 4: job_trade_contractor -> id: 4 time_out: 10-01-2020 5: job_trade_contractor -> id: 5 time_out: 25-01-2020

结果应该是

j2 j1

因为我们有 job_trade_contractor 的 time_out 值:10-01-2020 as min in j2 和 11-01-2020 在 j1

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-4 ruby-on-rails-5


    【解决方案1】:

    我们可以通过以下方式实现排序,这可能对你有帮助,

    has_many :job_trade_contractors, through: :job_trades, order: 'job_trade_contractors.time_out'
    

    has_many :job_trade_contractors, ->  { order(time_out: :asc) }, through: :job_trades
    

    【讨论】:

    • 感谢您的回复。但我不想对关联进行任何更改。我想要一个sql查询什么的
    【解决方案2】:
    Job.joins(job_trades: :job_trade_contractors).order('job_trade_contractors.time_out').uniq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多