ruby-on-rails - 如何使用 Sunspot 确定 Rails 中枚举的范围?

标签 ruby-on-rails ruby solr enums sunspot

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

我的 Controller 中的搜索 block 如下所示:

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) 之类的查询时,我得到了正确的结果,所以我不确定为什么这不起作用。

提前致谢。

最佳答案

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

解决办法:

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

def perspective_id
  Upload.perspectives[self.perspective]
end

修改可搜索 block :

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

Controller 中的搜索 block :

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

关于ruby-on-rails - 如何使用 Sunspot 确定 Rails 中枚举的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29161105/

相关文章:

arrays - Ruby-将数组拆分为非常长的子数组

Ruby - 在下一分钟开始获取时间

indexing - Solr - 如何 "group by"和 "limit"?

ruby-on-rails - Postgres hstore 和 Rails sunspot solr

ruby-on-rails - Rails 应用程序 GET 路线在生产模式下不起作用

ruby-on-rails - 使用反引号从 Rails 应用程序中启动另一个 Rails 服务器

ruby-on-rails - 如何一起使用 Nodejs 和 Ruby on Rails?

jquery - 查找 rails 中的日期差异

ruby - 重构控制参数

search - solr/lucene/ Elasticsearch 中的文档合并中,排名/分数如何工作?