0

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

@users = User.joins(...).where(...).select("users.id") 

Из этого результата я хочу сделать записи distinct и в RANDOM() заказе

Я могу» похоже, воссоздают это с помощью activerecord.

С SQL это будет выглядеть как

SELECT DISTINCT users.* 
from (long complex query) 
ORDER BY RANDOM() 
+0

Я не хватаю всех пользователей, и после этого я ограничиваю запрос. Перетасовка была бы ужасно медленной. Все, что я хочу, - это заказать RANDOM() с помощью setseed, но я либо получаю дубликаты, либо получаю сообщение о том, что я не могу заказать случайным образом, если я не выбираю случайный столбец. Выбор столбца random() делает строку нечетной ... –

+0

да, но это потребовало бы, чтобы я выделил столбец RANDOM() для его заказа, что сделало бы это не отличным от –

ответ

1

Один из самых простых вещей, чтобы сделать, а не строить сложные запросы в любых рамках, чтобы построить сложный запрос со стандартным SQL, а затем оберните его в вид:

CREATE VIEW complex_stuff AS 
    SELECT DISTINCT users.* 
    FROM (long complex query) 
    ORDER BY RANDOM(); 

мнение становится простым объектом или класса, от которого вы тянете необходимые столбцы, возможно, фильтрация по некоторому колонку (SELECT a, b, c FROM complex_stuff WHERE d = ?).

+0

, не знакомым с VIEW в SQL или если это возможно сделать это с помощью activerecord. Можете ли вы связать мне что-то, чтобы прочитать об этом? –

+0

Вид похож на сохраненный оператор SELECT. Вы используете его так же, как и любой другой стол. Фактически вы делаете попытку проектирования сложного запроса один раз, а затем используйте его повторно. Это намного эффективнее, чем выполнение этого в ror, потому что план запроса хранится в PostgreSQL. Вы можете прочитать мнения [здесь] (http://www.postgresql.org/docs/current/static/tutorial-views.html). – Patrick

+2

Кроме того, ваш код ror станет намного чище и проще в обслуживании. В общем, вы должны позволить PostgreSQL делать то, для чего он предназначен: хранить данные и обрабатывать их в возможно сложных запросах, а также использовать Ruby, где он превосходит: представление данных пользователю. – Patrick

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