在我的应用程序中,我使用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搜索(当这个参数出现时),我该如何解决这个问题呢?
答案 0 :(得分:0)
我不确定has_scope
gem是否适用于Thinking Sphinx范围,但您可以在模型中尝试以下内容(它取代现有的ActiveRecord范围):
include ThinkingSphinx::Scopes
sphinx_scope(:by_description) { |description| description }
但请记住,此范围返回的是Thinking Sphinx搜索对象,而不是ActiveRecord关系,因此您无法将其与ActiveRecord方法结合使用,例如where
或order
(并且您也无法在其上调用任何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查询一起使用。