2009-10-21 10 views
1

dans le produit que je développe, j'ai un modèle de message.rails - appliquer des paramètres de visibilité complexes aux résultats de sphinx de réflexion

Le message peut être restreint à des groupes ou ne pas être restreint (disponible pour tout le monde).

Si l'utilisateur appartient à l'un des groupes de messages OU que le message n'est pas restreint, l'utilisateur peut voir le message.

ici est la requête la sélection des messages visibles (dans l'espoir qu'il peut clarifier ce que je veux dire)

(2,3,4,5,6,1) sont les groupes utilisateur appartient, ils sont différents pour chaque utilisateur

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 

ici est question une sous-requête analogique, dans l'espoir qu'il aide à clarifier ce qui est nécessaire

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

est-il possible en quelque sorte d'appliquer ce paramètre de visibilité à penser résultats sphinx? signifiant appliquer ce OU et IN à

Message.search "test" with/with_all 

?

s'il est impossible, une autre question serait - est-il en quelque sorte possible d'obtenir ids de tous les objets trouvés à la recherche,

pour que je puisse effectuer moi-même interroger, tout ajout et à mon OÙ état

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) 

j'imagine à la fois la requête sans LEFT JOIN et ajout à OÙ sera un peu gourmand en ressources MySQL, mais si d'autres solutions sont pas possible, cela ferait

grâce,

Pavel K

Répondre

2

a reçu une réponse de Pat Allan, développeur de Thinking Sphinx,

link text

Je pense que la meilleure façon est de construire une chaîne qui comprend 0 si le message
est sans restriction, sinon renvoie les ID de groupe, concaténés
avec com mas ...à savoir: "2,3,4,5,6" ou "0"

Ainsi, vous aurez envie de construire un extrait de SQL pour un attribut, quelque chose
vaguement:

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

Et puis pour la recherche:

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

L'extrait de code SQL devra être différent si vous utilisez PostgreSQL, cependant ... faites-moi savoir si c'est le cas.

va essayer que

Questions connexes