рельсы - примените сложные настройки видимости к результатам мышления сфинкса - PullRequest
1 голос
/ 21 октября 2009

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

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

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

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

(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) )
 )

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

Message.search "test" with/with_all

?

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

чтобы я мог выполнить запрос сам, просто добавив И в мое ГДЕ состояние

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)

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

спасибо,

Павел К

1 Ответ

2 голосов
/ 22 октября 2009

получил ответ от Пэт Аллана, разработчика 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, хотя ... дайте мне знать, если это так.

попробует это

...