ruby on rails 3 - расширенный поиск с использованием драгоценных камней - PullRequest
2 голосов
/ 19 марта 2012

У меня есть модель User со столбцами для Local, Skype и Phone (логическое значение, 't' или 'f') и Gender (строка, 'Male' или 'Female'). Каждый пользователь может иметь много навыков в соответствующей модели SkillMap, которая имеет skill_id и направление (строка, либо «Teach», либо «learn»)

Я возился с MetaWhere, Squeel и RanSack, пытаясь выяснить, что позволит мне искать этих пользователей самым приятным, читаемым и похожим на рельсы способом. Может кто-нибудь указать мне наиболее подходящий драгоценный камень и, возможно, дать мне несколько советов о том, как его построить?

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

id|user_id|skype|local|phone|teach_skill_ids|learn_skill_ids|gender
37|628|t|t|f|---- '795'|---- '789'- '771'- '827'|Male

Итак, в этом случае я хочу найти всех пользователей, у которых флаг скайпа ИЛИ локальный, имеют значение true (игнорируя phone = 'f'), у которых гендерный флаг равен 'Мужской', И у кого есть связанная skill_map, где direction = 'Teach' и skill_id = 795, И у кого есть skill_map, где direction = 'Learn', а skill_id - IN (789,771,827)

Я могу попытаться написать SQL, если это прояснит ситуацию, но я знаю, как это сделать, используя ужасные подзапросы (администраторы могут пропустить эту часть)

SELECT * FROM users 
WHERE gender = 'Male'
AND (local = 't' OR skype = 't')
AND id IN 
    (SELECT user_id FROM skill_maps
     WHERE direction = 'Teach' 
     AND id = 795)
AND id IN
    (SELECT user_id from skill_maps
     WHERE direction = 'Learn'
     AND id IN (789,771,827))

Если какое-либо из этих полей не заполнено или не заполнено, я не хочу включать их в качестве условия поиска.

Во всяком случае, это мой вопрос. Спасибо за взгляд!

Ура, Yonah

1 Ответ

0 голосов
/ 26 марта 2012

Я думаю, вы должны использовать поисковую систему, например inking sphinx или asticsearch .Мышление Сфинкс прост в использовании и настройке.

...