Пользовательская, Эффективная, Сложная сортировка в Rails 3 - PullRequest
5 голосов
/ 02 января 2012

Я хотел бы знать, как эффективно делать заказы в Rails.Мы все знаем, что вы можете сделать простой заказ в Rails следующими способами:

Model.order("created_at ASC").limit(10)

В этом случае я просто вытягиваю первые 10 записей.Если бы я хотел добавить порядок, не ограниченный по времени, я мог бы создать столбец в модели (например, custom_ordering column) и ввести значения для упорядочения объектов.В этом случае вы просто изменили бы вызов order("custom_ordering ASC").

НО, скажем, я хочу сделать заказ на основе предсказанных пользователем предпочтений.В этом случае невозможно создать новый столбец, потому что у каждого пользователя разные вкусы.Каким был бы разумный и эффективный способ решения этой задачи?

Одним из методов было бы создание алгоритма для прогнозирования пользовательского рейтинга объекта из модели с именем model_rating(object).Этот алгоритм выдаст положительное целочисленное значение их рейтинга.Если бы я пошел по этому пути, как бы я эффективно упорядочил модель?

Другим способом было бы установить алгоритм как model_entry.user_preference(user).Тогда я мог бы заказать по:

Model.all.sort! { |b, a| a.user_preference(user) <=> b.user_preference(user) } 

Но это кажется мне неэффективным.Он должен вызвать все записи в модели и затем отсортировать их, что, даже если вы используете эффективные методы сортировки, такие как слияние или пузырьковая сортировка, приводит к низкой производительности на моделях с большим количеством записей.

Существуют ли другие путиЯ не рассматриваю?Кто-нибудь может указать мне правильное направление здесь?

Ответы [ 2 ]

0 голосов
/ 03 января 2012

В этом решении я предполагаю, что расчет предпочтительного заказа пользователя является дорогостоящим, и что заказываемый вами комплект обновляется не часто.

То, что вы могли бы сделать, это вычислять заказ очень часто (в фоновом режиме) и сохранять рассчитанный заказ в отдельной таблице для пользователя.

В качестве альтернативы, если у вас мало пользователей, вы можете сохранить в отдельной таблице оценку каждой модели для каждого пользователя и отсортировать по этому значению в объединении. Затем эти значения также можно пересчитывать на регулярной основе.

0 голосов
/ 03 января 2012

Пузырьковая сортировка неэффективна.

Если вы говорите о сортировке отдельной модели, то верно, что все входные данные сортировки будут атрибутами этой модели. Если каждый пользователь может указать свои предпочтения сортировки, он сводится к атрибуту или списку атрибутов. Сохраните этот список как пользовательский параметр, а затем динамически создайте запрос. Черт возьми, сохрани фактический код в качестве предпочтения и сделай оценку.

Но даже эффективный SQL ломается, когда количество записей приближается к порогу. В этом случае вам нужен новый инструмент.

Вы можете использовать правильную реализацию поиска, которая по своей природе включает в себя сортировку. Я использую Solr с самоцветом Sunspot. И кажется, что у Сфинкса с самоцветом мыслящего сфинкса тоже хорошая тяга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...