Как создать область для записей с наибольшим значением в связанном столбце таблицы - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть четыре связанных модели:

class Quest < ApplicationRecord
    has_many :steps, -> { order(step_number: :asc) }
    def last_step_number
      steps.maximum(:step_number)
    end
end

class Step < ApplicationRecord
    validates :step_number, presence: true
    belongs_to :quest
end

class Teamquest < ApplicationRecord
    validates :last_step_completed, presence: true
    belongs_to :quest

    def is_all_steps_completed
      last_step_completed == quest.last_step_number
    end
end

Я хотел бы добавить область действия в Teamquest, которая возвращает все записи, где метод модели Teamquest is_all_steps_completed == true

1 Ответ

0 голосов
/ 15 ноября 2018

Это будет работать, соединение с выбором, которое возвращает только строку с максимальным шагом:

Teamquest.joins("
  INNER JOIN (
    SELECT quest_id, MAX(step_number) AS max_step 
    FROM steps 
    GROUP BY quest_id) max_steps 
    ON max_steps.quest_id = teamquests.quest_id"
).where("last_step_completed = max_steps.max_step")

Я бы действительно подумал о денормализации вашей базы данных и сохранении steps_count в quests таблице, чтобы все было проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...