Прежде всего, вам необходимо реализовать геоинформацию сфинкса, как показано на рисунке here. Один вы сделали это (скажем, вы сделали это для таблицы пользователей) теперь вы можете сделать:
@compatible_users = User.search "keyword", :geo => [@lat, @lng],
:with => {'@geodist' => 0.0..10_000.0}
Вы можете использовать «ключевое слово», что вы предпочитаете. @lat
и @lng
- координаты current_user, @geodist выражается в метрах (поэтому в этом случае это означает «от 0 до 10 км»). Вам также понадобится условие для пола (извините, я не знаю вашего имени полей модели, но это не должно быть проблемой, если вы знаете, как использовать sphinx) Как только у вас есть коллекция @compatible_users
, задача Теперь, чтобы случайно выбрать некоторые из них:
n = 8 # This is the number of users you want.
# Ruby 1.9+
@ result = @compatible_users.sample(n)
# Ruby 1.8
@ result = @compatible_users.shuffle[0...n]
и у вас есть совместимые пользователей в @result
:)
Имейте в виду, что если @compatible_users.size
ниже n
вы получите сообщение об ошибке с помощью shuffle
и более короткий массив, используя sample
. Таким образом, вам может потребоваться проверить его и, в конечном счете, сделать еще один поиск сфинкса с более широким диапазоном @geodist
К сожалению, какая именно проблема? Выбор по двум конкретным критериям в сфинксе - это самое прямое дело ... В чем вопрос? Для них быть случайным или добавить геолокацию? –