Rails + Sunspot:“未分配”方面用于过滤未分配关联的记录?

时间:2011-11-08 20:08:50

标签: ruby-on-rails sunspot faceted-search

还在了解facet,但我想过滤没有分配相关记录的记录。首先是一些代码:

模特:

class Project < ActiveRecord::Base
  belongs_to :category

  searchable do
    text :name
    integer :category_id, :references => Category
  end
end

控制器:

class ProjectsController < ApplicationController
  def index
    @search = Project.search do
      fulltext params[:q]
      facet :category_id
      with(:category_id, params[:category_id]) if params[:category_id].present?
    end
    @projects = @search.results
    respond_with(@projects)
  end

观点:

<ul>
  <% for row in @search.facet(:category_id).rows %>
    <li>
      <% if params[:category_id].blank? %>
        <%= link_to row.instance.name, :category_id => row.value %> (<%= row.count %>)
      <% else %>
        <strong><%= row.value %></strong> (<%= link_to "remove", :category_id => nil %>)
      <% end %>
    </li>
  <% end %>
</ul>

该视图显示了一个类别过滤器列表及其各自的计数,但是,我想要包含一个&#34;未分配&#34; facet (及其计数),它将查询尚未分配类别的项目。这可能与方面有关吗?那么,&#34;分配任何&#34; facet(及其计数)过滤已分配任何类别的项目?谢谢。

1 个答案:

答案 0 :(得分:2)

我知道你问这个问题已经有一段时间了。但我最近一直在使用rails / sunspot / solr,偶然发现了你的问题。希望你找到了答案,但如果没有,请按照我的说法进行操作。

分面是一种对当前搜索结果进行分类的方法。获得&#34;未分配&#34;的一种方法实现的方面是用它实际索引对象。

在您的项目模型中,我会将其更改为:

class Project < ActiveRecord::Base
  belongs_to :category

  searchable do
    text :name
    string :category_name do
      category_id.present? ? (category.name + "|" + category_id.to_s) : "Unassigned"
    end
  end
end

我看到您在视图中使用row.instance.name来获取类别名称。因为我已将可搜索的属性切换为字符串(并且出于显而易见的原因,您不能将:referencesrow.instance与字符串值一起使用!)我已经选择了使用category_name|category_id类型字段的组合索引字段。如果Project没有category_id,则会使用字符串"Unassigned"

现在我们更改搜索块中的代码以反映或模拟更改。

class ProjectsController < ApplicationController
  def index
    @search = Project.search do
      fulltext params[:q]
      facet :category_name
      with(:category_name, params[:category_name]) if params[:category_name].present?
    end
    @projects = @search.results
    respond_with(@projects)
  end

并且视图代码也会更改:

<ul>
  <% for row in @search.facet(:category_name).rows %>
    <li>
      <% if params[:category_name].blank? %>
        <%= link_to (row.value.include? '|') ? row.value.split('|')[0] : row.value, :category_name => row.value %> (<%= row.count %>)
      <% else %>
        <strong><%= row.value %></strong> (<%= link_to "remove", :category_name => nil %>)
      <% end %>
    </li>
  <% end %>
</ul>