алгоритм ruby ​​(rails) массив лучших результатов - PullRequest
0 голосов
/ 13 мая 2011

Я пытаюсь связать некоторые (десять) предметов с другим.Для выбора предметов у меня есть несколько критериев, которые являются атрибутами моего предмета (скажем, «категория», «размер» и «вес»).Каждый из этих критериев имеет оценку (скажем, 15 для категории, 8 для размера и 3 для веса).

Моя идея найти десять лучших предметов для связи с текущим состояла в следующем:

  • Получить массив со всеми возможными комбинациями критериев, упорядоченными по баллам.В этом случае у меня должно быть: [['category', 'size', 'weigth'], ['category', 'size'], ['category', 'weight'], ['category'], ['размер ',' вес '], [' размер '], [' вес]] (соответствующие оценки: 26, 23, 18, 15, 11, 8, 3)

  • Затем сделайте уникальный запрос со всеми комбинациями в порядке с СОЮЗОМ между каждой комбинацией и пределом 10 в конце.Запрос sql будет выглядеть примерно так:

(Select * From items Where category = "food" and size = "3" and weight = "7")<br /> UNION <br /> (Select * From items where category = "food" and size = "3")<br /> UNION<br /> (.....)<br /> limit 10;

Я проверил этот запрос, и, похоже, он работает хорошо.Идея состоит в том, что важные запросы являются первыми, поэтому результаты первых запросов находятся в самом верху, а предел 10 просто сохранит наиболее релевантные результаты.Но, говоря о том, что у меня есть некоторые сомнения, он может работать с другой базой данных (он работает на MySQL, но я не уверен, что он будет работать с PostGreSQL).Что вы думаете об этом?

  • И это все, что я могу связать результаты с моим текущим элементом.

Моя проблема в первом пункте, я не знаюкак получить этот упорядоченный массив со всеми комбинациями критериев.

Если у вас есть идея, я возьму ее ^^

Заранее спасибо.

1 Ответ

2 голосов
/ 13 мая 2011

Обновлено согласно комментарию @ tokland.

Вот как вы можете создать массив комбинаций:

>> a = [*1..3] 
#=> [1, 2, 3]
>> b = (1..a.size).map { |n| a.combination(n).to_a }.flatten(1) 
#=> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

В другом шаге вы можете отобразить, объединить исортировать.

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