尝试让康康舞与思考狮身人面像一起工作,但遇到了一些问题。
在使用 sphinx 之前,我的公司 View 中有这样的内容:
@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 设置?
最佳答案
我认为 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 - 康康思维狮身人面像 current_ability 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6610426/