【问题标题】:Cancan Thinking Sphinx current_ability QuestionsCancan Thinking Sphinx current_ability 问题
【发布时间】:2011-07-07 12:16:12
【问题描述】:

试图让 cancan 与会思考的 sphinx 一起工作,但遇到了一些问题。

在使用 sphinx 之前,我的公司有这样的看法:

@companies = Company.accessible_by(current_ability)

这使我的用户无法看到其他人的公司...

安装 sphinx 后,我得到了:

  @companies = Company.accessible_by(current_ability).search(params[:search], :include => :order, :match_mode => :extended ).paginate(:page => params[:page])

现在显示我所有的公司,而不是根据每个用户的能力进行优化。

它会看到 ts 没有为 cancan 设置?

【问题讨论】:

    标签: ruby-on-rails-3 thinking-sphinx cancan


    【解决方案1】:

    我认为accessible_by 可能更多的是一个范围——它是数据库/SQL 驱动的。 Sphinx 有自己的查询接口,因此 ActiveRecord 范围不适用。

    一种低效的解决方法(首先获得所有公司):

    company_ids = Company.accessible_by(current_ability).collect &:id
    @companies  = Company.search params[:search],
      :include    => :order,
      :match_mode => :extended,
      :page       => params[:page],
      :with       => {:sphinx_internal_id => company_ids}
    

    有几点需要注意:sphinx_internal_id 是索引模型的主键 - Sphinx 有自己的唯一标识符,名为 id,因此有区别。另外:您不想在搜索集合上调用 paginate - Sphinx 总是分页,所以只需将 :page 参数传递给搜索调用。

    我能想到两种更好的解决方法 - 或者有一个相当于 accessible_by 的 Sphinx,将相关信息作为属性添加到您的索引中 - 或者,如果不是很理想,更简单,只是让公司在我上面的 sn-p 的第一行中返回的 ids 没有将每个公司加载为 ActiveRecord 对象。两者都可能意味着绕过和/或复制 Cancan 的助手。

    虽然...也许这可以解决问题,采用后一种方法:

    sql         = Company.accessible_by(current_ability).select(:id).to_sql
    company_ids = Company.connection.select_values sql
    @companies  = Company.search params[:search],
      :include    => :order,
      :match_mode => :extended,
      :page       => params[:page],
      :with       => {:sphinx_internal_id => company_ids}
    

    避免加载不必要的 Company 对象,使用 Cancan 帮助程序(前提是它是/返回一个范围),并与 Sphinx/Thinking Sphinx 所期望的完美配合。不过我没用过Cancan,所以这有点猜测。

    【讨论】:

    • 哇,比我希望的要复杂一些...让我消化一下您的方法-非常感谢您抽出宝贵时间回答
    • 还值得注意的是,Ryan Bates(Cancan 的作者)已经确认 access_by 是一个作用域,所以最终的解决方案应该可以解决问题。有任何问题,请告诉我:)
    • 有没有办法直接把sql传给thinking_sphinx?这个解决方案很棒,但如果 company_ids 数组变大,它似乎很难扩展。
    • Sphinx 在处理搜索时不理解 SQL - 它只在索引时与数据库对话 - 因此在搜索过程中给它一个 SQL 查询是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多