有没有办法混合名为范围的轨道和思考sphinx范围?

时间:2011-10-06 18:36:00

标签: ruby-on-rails thinking-sphinx named-scope

有没有办法混合命名范围和sphinx范围?我不敢相信没有。

我在课程中有狮身人面像指数。用户购买课程后,他们会有一个屏幕,可以看到他们所有课程的列表。我希望他们在网站范围内的课程中执行相同的搜索,但确定他们拥有的搜索范围。

对于仅限sphinx的范围,这显然是不可能的,因为我没有索引购买数据,我认为我也不应该这样做。

有没有办法实现这个目标?

这就是我迄今为止“结合”这两个系统的原因。对我来说似乎很骇然但是它有效:

lesson_ids = current_user.active_products_by_type(:lessons).collect{|x| x.id}
@lessons = Lesson.active_scope.search :with => {:id => lesson_ids }

2 个答案:

答案 0 :(得分:3)

考虑到我不确定范围active_products_by_typeactive_scope是什么(哪个是Sphinx?两者都没有?),这有点难以判断你的解决方案是否合适。

但是你不能在搜索调用上调用AR作用域,因为AR作用域是在生成SQL查询的基础上构建的。 Sphinx有自己的查询协议,这就是Thinking Sphinx添加Sphinx范围的原因。除此之外,Sphinx在搜索时无法引用数据库(仅在索引时),因此对Sphinx无法看到的数据的任何引用都不会有帮助。

所有这一切,代码中可能没有任何内容可以让您将搜索调用链接到AR范围 - 您甚至可能会得到结果 - 但这是因为范围会影响Model.find调用思考Sphinx将搜索结果转换为模型实例。结果是,当您可能看到对象时,AR范围仅应用于搜索结果的给定页面,并且分页数学(页数/总结果)将不可靠。

Urgh,这变成了一篇文章,但希望它有所帮助......

答案 1 :(得分:2)

我想最好以AR范围结束才能做.includes,.joins等:

sphinx_scope(:visible) do
  { with: {is_visible: true} }
end

@items = Item.where(
  id: Item.visible.search_for_ids(nil,
    page: params[:page],
    with: {
      tag_id: @tag.id,
      category_id: current_category.id
    }
  )
).order(:id).includes(:photos)