2015-02-19 2 views
0

Я пытаюсь отобразить список статей, отсортированных по дням, но отображаемых случайным образом для каждого дня.shuffle then sort a db query ruby ​​

Это то, что я прямо сейчас:

@articles = Article.all.shuffle.sort_by{|t| t.date_published}.reverse 

Я думал, что-то будет иметь место на перемешиваются массива, но это не похоже, что происходит. Любая помощь будет принята с благодарностью!

Я пробовал group_by, похоже, не может заставить его работать.

ответ

3

Небольшая проницательность для вашего кода: all извлеките ВСЕ записи из базы данных и передайте их вашему рубиновому коду, t его ресурс и много времени. Затем shuffle, sort_by и reverse выполнены рубином. Вы быстро столкнетесь с проблемами производительности, так как ваша база данных растет.

Ваше решение должно позволить серверу базы данных выполнить эту работу. Серверы БД очень оптимизированы для всех операций сортировки. Так что, если вы, например, с помощью MySQL вы должны использовать вместо этого:

@articles = Article.order('`articles`.`date_published` DESC, RAND()') 

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

+0

Спасибо за обратную связь. Тем не менее, похоже, что все еще работает. В настоящее время у меня есть дата в строковом типе. Я вижу, могу ли я преобразовать их все в стандартизованный тип, а затем, возможно, он будет работать ... – MarkD

+0

Ваш вопрос о сортировке, мой ответ о сортировке. Если у вас проблемы с типом данных, это еще одна история, и вам нужно управлять этими двумя проблемами отдельно. Является ли сортировка подходящей для моего ответа? – Benj

+0

Да, это похоже на сортировку с ответом, который вы дали, но не все статьи сортируются по желанию, только некоторые из них. И я думаю, что это, вероятно, связано с форматом date_published, и все они не совсем одинаковы, поскольку они очищаются от других сайтов. – MarkD

0

Хм, вот весело взломать, что должны работы:

@articles = Article. 
    all. 
    sort_by{|t| (t.date_published.beginning_of_day.to_i * 1000) + rand(100)} 

Это работает, заставляя все даты, чтобы стать началом дня (так что все опубликованные на «2015-02-19» например, будет иметь то же значение to_i. Затем вы умножаетесь на 1000 и добавляете случайное число от 0 до 100 для сортировки (любое число меньше 1000 будет работать).