Как найти записи с максимальным значением (определенным в ассоциированной модели) в день - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы получить все записи в день с наивысшим приоритетом (как определено в соответствующей модели)

Я изо всех сил пытаюсь построить это с помощью activerecord (rails 4.2)

Проблема в том,очень похоже на этот Получить записи с максимальным значением для каждой группы сгруппированных результатов SQL за исключением того, что возраст будет получен из второй модели

или также этой с activerecordЯ выбираю записи на основе наибольшего значения поля?

Model 1: Workduration: 
    date, duration 
    belongs_to :timerule

Model 2: Timerule: 
    priority
    has_many :workdurations

Я собрал данные следующим образом (все в Workduration)

def self.withPrio
    select("workdurations.*, timerules.prio AS prio").joins(:timerule)
end

Я не смог найтиправильный способ построить левое внешнее соединение (самостоятельное соединение) на нем.

Код проб и ошибок:

Workduration.withPrio.joins("left join ? workdurations.date = wd2.date and workdurations.prio < wd2.prio", Workduration.withPrio)

Любая помощь приветствуется!

1 Ответ

1 голос
/ 15 апреля 2019

Я закончил тем, что сделал это с (большим) find_by_sql и вторым запросом для обеспечения цепочки областей:

  scope :maxPrioIds, ->{find_by_sql('SELECT o.*
                                  FROM
                                    (SELECT  workdurations.*, timerules.prio AS prio FROM "workdurations" INNER JOIN "timerules" ON "timerules"."id" = "workdurations"."timerule_id") o
                                  LEFT JOIN (SELECT  workdurations.*, timerules.prio AS prio FROM "workdurations" INNER JOIN "timerules" ON "timerules"."id" = "workdurations"."timerule_id") b
                                  ON o.date = b.date AND o.prio < b.prio
                                  WHERE b.prio is NULL').map(&:id)}
  scope :relevant, -> {where(id: Workduration.maxPrioIds)}
...