1

在我的应用程序中,我使用has_scopegem 和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 搜索(当这个参数出现时),我该如何解决这个问题?

4

1 回答 1

0

我不确定has_scopegem 是否可以与 Thinking Sphinx 范围一起使用,但您可以在模型中尝试以下操作(它替换了您现有的 ActiveRecord 范围):

include ThinkingSphinx::Scopes

sphinx_scope(:by_description) { |description| description }

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

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

然而,这一切都建立在 gem 的方法足够简单的假设之上has_scope,它只会在给定模型上调用类级别的方法,无论它们是否是 ActiveRecord 范围。

从避免has_scopegem 更改引起的问题的角度来看,我建议不要将它与 Thinking Sphinx 查询一起使用。

于 2014-04-01T12:37:20.270 回答