ruby-on-rails-3 - 康康思维狮身人面像 current_ability 问题

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

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

在使用 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/

相关文章:

ruby-on-rails - 如何处理 ActiveModel 的翻译?

ruby-on-rails - Resque 工作人员静默失败,没有日志或没有调试信息

mysql - ThinkingSphinx::SphinxError(未知的 MySQL 错误)

ruby-on-rails - 如何从我的 ability.rb 中指定自定义异常消息?

ruby-on-rails - 如何使用 RSpec 正确测试 CanCan 能力

ruby-on-rails-3 - Ruby 数据建模 has_many 关系两种方式

ruby-on-rails - facebook 身份验证后与门卫进行身份验证

mysql - 思考狮身人面像 : Another index error

ruby-on-rails - 思考 sphinx 无法配置开发配置

ruby-on-rails - rails (设计/cancan/rolify): more efficient way to get users with certain role