如何使用太阳黑子在Rails中调整枚举?

我正在尝试使用Sunspot(Rails Solr gem)来使用我在模型中声明的枚举来调整结果范围。 我模型的相关部分如下所示:

searchable do text :tag_list boolean :approved integer :perspective time :created_at end enum perspective: [ :not_applicable, :front, :side_front, :side, :side_back, :back, :above, :below ] 

我控制器中的搜索块如下所示:

 def index //skip scoping if perspective is nil params[:perspective] ||= [] @search = Upload.search do with :approved, true with :perspective, params[:perspective] fulltext params[:tag] fulltext params[:search] do minimum_match 1 end paginate page: params[:page], per_page: 30 end @uploads = @search.results @query = params[:search] end 

我用来收集参数的链接看起来像这样:

  

基本上我正在尝试设置它,以便在获得批准的范围界定后返回所有这些标准的任何组合的结果。 我已经使用了基于文本的搜索标准,但是透视的范围不起作用。 搜索只返回0的所有结果,没有任何其他值的结果。 我错过了关于Sunspot / Solr如何使用枚举的内容吗? 当我执行诸如Upload.where(perspective:1)之类的查询时,我得到了正确的结果,所以我不确定为什么这不起作用。

提前致谢。

我终于解决了这个问题。 问题是虽然Rails将枚举值存储为数据库中的整数,但在调用enum属性时(在这种情况下为@ upload.perspective),它不会检索该整数。 这将返回与值的名称相对应的字符串(在这种情况下为“front”,“side”等)。 这个问题是在我的可搜索块中,我将透视字段声明为整数。

解决方案:

模型中的一个方法,用于获取枚举id整数而不是名称:

 def perspective_id Upload.perspectives[self.perspective] end 

修改可搜索的块:

 searchable do text :tag_list boolean :approved integer :perspective_id time :created_at end 

和控制器中的搜索块:

 def index #if no perspective, set to empty hash so solr skips params[:perspective] ||= [] @search = Upload.search do with :approved, true with :perspective_id, params[:perspective] fulltext params[:tag] fulltext params[:search] do minimum_match 1 end paginate page: params[:page], per_page: 30 end @uploads = @search.results @query = params[:search] end 

Rails枚举是一个非常黑暗的魔法。 记住它是数据库中的所有整数。

我打赌你的params[:perspective]是一个字符串(比如'front' )而不是一个基础整数。 另一方面,调用Model.perspectives[:front]将返回正确的整数值。 尝试使用将其转换为基础值

 Model.perspectives[params[:perspective]] 

在传递给搜索方法之前。

更多信息: rails docs

您不必实际编写那些额外的编码。 就这样做:

 searchable do #... string :perspective #... end #while searching with :perspective, 'above'