2016-03-06 1 views
0

Я пытаюсь совместить инструкцию uniq с оператором select("distinct") в Active Record, и это приводит к двум ключевым словам DISTINCT, что, конечно же, приводит к неверному запросу. Это самый простой пример, который я придумал. (Марк, который упрощен для того, чтобы помочь вам понять проблему - я не просто просить, как я получаю из различных идентификаторов из базы данных.)Как объединить uniq с select ("distinct") без получения недопустимого запроса?

Product.all.uniq.select("distinct id").map(&:id) 

This gives me this error message: 
Product Load (0.7ms) SELECT DISTINCT distinct id FROM "products" 
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "distinct" 
LINE 1: SELECT DISTINCT distinct id FROM "products" 
        ^
: SELECT DISTINCT distinct id FROM "products" 

Почему я получаю два DISTRINCT ключевые слова здесь? Есть ли способ избежать этого? Использование uniq дважды работает, но мне нужно сделать выбор для одного из фильтров, которые я реализую.

Редактировать: select("distinct..") должно быть выполнено перед заявлением uniq.

+0

Я считаю, что это то, что вы ищете: http://stackoverflow.com/questions/9658881/rails-select-unique-values-from-a-column – akz92

+0

Нет, I1m нет. В этом вопросе спрашивается, почему модели с одним полем не равны. Я хочу знать, почему я получаю недопустимый запрос от объединения простого 'uniq' с' select ("distinct ...") 'и как я могу его исправить. – karianneberg

ответ

1

uniq уже использует DISTINCT. Используйте либо uniq, либо select("DISTINCT"). Кроме того, вы должны использовать pluck, а не сопоставлять записи и выбирать id.

То, что вы действительно хотите использовать

Product.pluck(:id) 

или

Product.all.ids 

Что мне не понятно, почему вы хотите использовать distinct. Каким образом идентификатор имеет повторяющиеся значения?

Если поле отличается идентификатором, просто используйте

Product.select("DISTINCT(field)").map(&:field) 

или даже лучше

Product.uniq.pluck(:field) 

Таким образом, в вашем случае

Product.uniq.pluck(:id) 
# => SELECT DISTINCT "products"."id" FROM "products" 
+0

Это очень упрощенный пример, чтобы было легче понять. Мои настоящие запросы гораздо более продвинутые, и они создаются по нескольким строкам кода и используют возможности других моделей. Я знаю, что 'uniq' добавляет ключевое слово' DISTINCT' sql, но я не знаю, добавила ли одна из добавленных областей выражение 'uniq' или нет. – karianneberg

+0

Тогда не упрощайте свой пример, иначе мы не сможем дать точный ответ. –

0

Вы можете использовать uniq(false) отключить ранее использованный uniq scope. Так что ваш пример будет идти, как это: документация кода

scope = Product.all.uniq 
scope.uniq(false).select("distinct id").map(&:id) 

Источника может быть найдена here.

+0

Это работает, если 'uniq' добавлен перед' select ("distinct ...") ', но не после. К сожалению, это то, что я должен сделать. Я уточню вопрос. – karianneberg

+0

Возможно, вы могли бы использовать 'unscope' в этом случае, что-то вроде' Product .... select ("distinct id"). Unscope (: select) .uniq ... '? – BoraMa

+0

Но я хочу, чтобы 'select (" ...")', который будет использоваться, если он определен. Мне нужно использовать проверку '.to_sql'? – karianneberg

Смежные вопросы