rails — применять сложные настройки видимости к результатам мышления сфинкса

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

Сообщение может быть ограничено группами или не ограничено (доступно всем).

Если пользователь принадлежит к одной из групп сообщения ИЛИ сообщение не ограничено, пользователь может увидеть сообщение.

вот запрос, выбирающий видимые сообщения (в надежде, что он прояснит, что я имею в виду)

(2,3,4,5,6,1) - группы, к которым принадлежит пользователь, они разные для каждого пользователя

SELECT `messages`.* FROM `messages`

LEFT JOIN groups_messages ON
messages.id=groups_messages.message_id AND groups_messages.group_id in (2,3,4,5,6,1)

 WHERE (messages.restricted=0 OR groups_messages.group_id is not NULL)

GROUP BY messages.id

вот аналогичный запрос с использованием подзапроса, в надежде, что это поможет прояснить, что нужно

SELECT * FROM `messages` WHERE 
(
 restricted=0 OR id in ( select distinct message_id from groups_messages where group_id in  (2,3,4,5,6,1) )
 )

можно ли каким-то образом применить этот параметр видимости к результатам мышления сфинкса? смысл применить это ИЛИ и В к

Message.search "test" with/with_all

?

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

чтобы я мог выполнить запрос сам, просто добавив AND к моему условию WHERE

SELECT * FROM `messages` WHERE
(
 restricted=0 OR id in ( select distinct message_id from groups_messages where group_id in (2,3,4,5,6,1) )
)
AND id in (ids_of_the_messages_found_by_thinking_sphinx)

я предполагаю, что запрос без LEFT JOIN и добавление AND к WHERE будет немного ресурсоемким для mysql, но если другие решения невозможны, то это подойдет

Благодарность,

Павел К


person Pavel K.    schedule 21.10.2009    source источник


Ответы (1)


получил ответ от Пэта Аллана, разработчика Thinking Sphinx,

текст ссылки

Я думаю, что лучший способ — построить строку, включающую 0, если сообщение
не имеет ограничений, в противном случае возвращает идентификаторы групп, объединенные
вместе с запятыми... т. е.: "2,3,4,5,6 " или "0"

Итак, вам нужно создать фрагмент кода SQL для атрибута, что-то вроде
примерно такого:

has "IF(messages.restricted = 0, '0', GROUP_CONCAT (groups_messages.group_id SEPARATOR ','))", :as => :group_ids, :type => :multi

И затем для поиска:

Message.search "foo", :with => {
 :group_ids => [0] + current_user.message_group_ids
}

Фрагмент SQL должен быть другим, если вы используете PostgreSQL, однако... дайте мне знать, если это так.

попробую это

person Pavel K.    schedule 22.10.2009