gpt4 book ai didi

ruby-on-rails-3 - Cancan Thinking Sphinx current_ability 问题

转载 作者:行者123 更新时间:2023-12-04 06:20:43 26 4
gpt4 key购买 nike

试图让康康与思考狮身人面像一起工作,但遇到了一些问题。

在使用 sphinx 之前,我在公司的观点中有这样的:

@companies = Company.accessible_by(current_ability)

这阻止了我的用户看到其他人的公司......

安装狮身人面像后,我最终得到:
  @companies = Company.accessible_by(current_ability).search(params[:search], :include => :order, :match_mode => :extended ).paginate(:page => params[:page])

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

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

最佳答案

我认为更多的是accessible_by可能是一个范围 - 这是数据库/SQL 驱动的。 Sphinx 有自己的查询接口(interface),因此 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 ,将相关信息作为属性添加到您的索引中 - 或者,如果不是很理想,则更简单,只需在我上面的代码片段的第一行中返回公司 ID,而无需将每个公司加载为 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,所以这有点猜测。

关于ruby-on-rails-3 - Cancan Thinking Sphinx current_ability 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6610426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com