有没有办法混合命名范围和sphinx范围?我不敢相信没有。
我在课程中有狮身人面像指数。用户购买课程后,他们会有一个屏幕,可以看到他们所有课程的列表。我希望他们在网站范围内的课程中执行相同的搜索,但确定他们拥有的搜索范围。
对于仅限sphinx的范围,这显然是不可能的,因为我没有索引购买数据,我认为我也不应该这样做。
有没有办法实现这个目标?
这就是我迄今为止“结合”这两个系统的原因。对我来说似乎很骇然但是它有效:
lesson_ids = current_user.active_products_by_type(:lessons).collect{|x| x.id}
@lessons = Lesson.active_scope.search :with => {:id => lesson_ids }
答案 0 :(得分:3)
考虑到我不确定范围active_products_by_type
和active_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)