【问题标题】:How Do I Scope Enums in Rails Using Sunspot?如何使用 Sunspot 在 Rails 中定义枚举范围?
【发布时间】:2015-03-20 07:00:07
【问题描述】:

我正在尝试使用 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

我用来收集参数的链接如下所示:

<%= link_to upload.perspective.humanize, search_index_path(perspective: Upload.perspectives[upload.perspective]), class: "perspective" %>

基本上,我正在尝试进行设置,以便在确定范围后返回所有这些标准的任意组合的结果。我已经让它与基于文本的搜索条件一起使用,但是按角度确定范围不起作用。搜索只返回 0 的所有结果,而没有返回任何其他值的结果。我是否遗漏了一些关于 Sunspot/Solr 如何与枚举一起使用的信息?当我执行诸如 Upload.where(perspective: 1) 之类的查询时,我得到了正确的结果,所以我不确定为什么这不起作用。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby solr enums sunspot


    【解决方案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
    

    【讨论】:

    • 就是这样。不要忘记重新索引数据。谢谢。
    • 你也可以不用额外的方法来完成这个:integer :prespective_id do Upload.perspectives[self.perspective] end(注意块,请原谅评论格式)
    【解决方案2】:

    Rails 枚举是一种相当黑暗的魔法。请记住,它是数据库中的所有整数。

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

    将其转换为基础价值
    Model.perspectives[params[:perspective]]
    

    在传递给搜索方法之前。

    更多信息在这里:rails docs

    【讨论】:

    • 感谢您的回复。不幸的是,这仍然不起作用。我已经使用 byebug 确认我收到的参数是我希望传递给 Solr 的正确整数。我注意到它们是作为字符串发送的,例如“2”,所以我尝试在搜索块中将 params[:perspective] 更改为 params[:perspective].to_i 但仍然得到相同的结果。
    【解决方案3】:

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

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

    【讨论】:

    • 这没有多大帮助。当您将值发送到查询范围时,这将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多