rails has_scope和sphinx搜索

时间:2014-04-01 07:32:58

标签: ruby-on-rails ruby-on-rails-4 thinking-sphinx has-scope

在我的应用程序中,我使用has_scope gem和thinking sphinx,在模型中我写了类似的内容:

scope :by_description, -> description { where("description like ?", "%#{description}%") if description.present?}

然后,在控制器中:

has_scope :by_description

def somemimimi
  @cars = apply_scopes(Car).order(created_at: :desc).page(params[:page]).per(20)
end

但是当我试着写下这样的东西时:

scope :by_description, -> description { search description}

我收到以下错误

 you cannot search with Sphinx through ActiveRecord scopes

但我也只是用sphinx搜索(当这个参数出现时),我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

我不确定has_scope gem是否适用于Thinking Sphinx范围,但您可以在模型中尝试以下内容(它取代现有的ActiveRecord范围):

include ThinkingSphinx::Scopes

sphinx_scope(:by_description) { |description| description }

但请记住,此范围返回的是Thinking Sphinx搜索对象,而不是ActiveRecord关系,因此您无法将其与ActiveRecord方法结合使用,例如whereorder (并且您也无法在其上调用任何ActiveRecord范围)。因此,您需要调整控制器中apply_scopes调用后链接的内容。也许如下:

@cars = apply_scopes(Car).search(order: 'created_at DESC', page: params[:page], per_page: 20)

然而,这完全建立在假设has_scope gem的方法很简单的基础上,它只是在给定模型上调用类级方法,无论它们是ActiveRecord还是ActiveRecord范围与否。

从避免has_scope宝石变化问题的角度出发,我建议不要将其与Thinking Sphinx查询一起使用。