Добавить DISTINCT ON в операторе выбора в области активной записи

Я пытаюсь использовать отличную в рельсах с областью видимости, я создал метод в моей модели следующим образом:

def self.fetch_most_recent_by_user(scope)
  scope.where(guid: scope.except(:select).select("DISTINCT ON (eld_logs.user_id) user_id, eld_logs.guid").order("user_id, eld_logs.created_at desc").map(&:guid))
end

Когда я выполняю это, я получаю сообщение об ошибке:

TestModel.fetch_most_recent_by_user(TestModel.includes(:user))

ERROR:  syntax error at or near "DISTINCT"
LINE 1: SELECT guid, DISTINCT ON (user_id) user_id...

По поиску на DISTINCT ON Я обнаружил, что это должен быть первый элемент в операторе select для postgres, чтобы он работал.

Я хочу предварять DISTINCT ON в утверждении выбора. Я попытался очистить старые операторы выбора с помощью except(:select) который я получил отсюда, но он не работает, потому что includes(:user) сначала добавляет атрибуты пользователей при выполнении левого соединения.

я использую Rails 4.0.13 а также Postgres 9.4.12, Любая помощь приветствуется.

1 ответ

Я обнаружил, что если включает в себя вмешиваться в отдельный мой подзапрос, потому что DISTINCT ON не удалось. Я изменил свой метод к этому, и он работает:

  def self.fetch_most_recent_eld_log_by_user(scope, include_associations = { })
    scope.where(guid: scope.except(:select).select("DISTINCT ON (eld_logs.user_id) eld_logs.user_id, eld_logs.guid").order("eld_logs.user_id, eld_logs.created_at desc").map(&:guid))
        .includes(include_associations)
  end

Тем не менее, было бы хорошо, если бы кто-то мог предоставить способ предварять что-либо в операторе select области действия активной записи.

Другие вопросы по тегам