【问题标题】:is there a way to mix rails named scopes and thinking sphinx scopes?有没有办法混合命名范围和思考狮身人面像范围的轨道?
【发布时间】:2011-10-06 18:36:00
【问题描述】:

有没有办法混合命名作用域和 sphinx 作用域?我不敢相信没有。

我有关于课程的狮身人面像索引。用户购买课程后,他们会在一个屏幕上看到所有课程的列表。我希望他们在站点范围的课程中执行相同的搜索,但仅限于他们拥有的课程。

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

有没有办法做到这一点?

这就是我迄今为止“结合”这两个系统的方法。这对我来说似乎很老套,但它确实有效:

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

【问题讨论】:

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


    【解决方案1】:

    鉴于我不确定active_products_by_typeactive_scope 的作用域是什么(Sphinx 是哪个?两者都不是?),所以很难判断你的解决方法是否合适。

    但您不能在搜索调用中调用 AR 范围,因为 AR 范围是在后台构建的,用于生成 SQL 查询。 Sphinx 有自己的查询协议,这就是 Thinking Sphinx 添加 Sphinx 作用域的原因。除此之外,Sphinx 在搜索时(仅在索引时)无法引用数据库,因此对 Sphinx 看不到的数据的任何引用也无济于事。

    话虽如此,代码中可能没有任何内容可以让您将搜索调用链接到 AR 范围 - 您甚至可能会返回结果 - 但这是因为范围会影响 Thinking Sphinx 的 Model.find 调用将搜索结果转换为模型实例。结果是,虽然您可能会看到对象,但 AR 范围仅适用于给定的搜索结果页面,并且分页数学(页数/总结果)将不可靠。

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

    【讨论】:

    • active_products_by_type 为命名范围,active_scope 为 TS 范围
    • 好的,那么你的解决方法可能是最好的方法。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多