Добавить 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 области действия активной записи.