【问题标题】:rails - apply complex visibility settings to thinking sphinx resultsrails - 将复杂的可见性设置应用于思考 sphinx 结果
【发布时间】:2009-10-21 16:04:47
【问题描述】:

在我正在开发的产品中,我有一个消息模型。

消息可以限制在群组中,也可以不受限制(可用于 大家)。

如果用户属于消息的组之一或消息不是 受限,用户可以看到消息。

这是选择可见消息的查询(希望它可以 澄清我的意思)

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

是否有可能以某种方式将此可见性设置应用于思考 狮身人面像结果?意味着将此 OR 和 IN 应用于

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 来说会有点资源密集,但如果有其他解决方案 不可能,那么就可以了

谢谢,

帕维尔·K

【问题讨论】:

    标签: ruby-on-rails mysql thinking-sphinx


    【解决方案1】:

    收到了 Thinking Sphinx 的开发者 Pat Allan 的回复,

    link text

    我认为最好的方法是构建一个包含 0 的字符串,如果
    消息不受限制,否则返回组 ID,连接
    加上逗号......即: “2,3,4,5,6”或“0”

    因此,您需要为某个属性构建一个 SQL sn-p,例如
    有点像:

    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
    }
    

    如果您使用的是 PostgreSQL,SQL sn-p 必须有所不同,不过……如果是这种情况,请告诉我。

    会试试的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多