0

我将 Select2 与 Rails 和 Mongoid 一起使用,并且我在服务器端使用 Sunspot Solr 进行搜索。我正在尝试通过 solr 过滤来自 mongo 的数据,通过 ajax 请求获取该数据并根据父子层次结构对结果进行分组。我无法弄清楚的是,当我搜索一个孩子时,如果有多个子结果,则父类别会出现多次。请阅读以下内容以获取更多信息:

这是我在 Mongo DB 中的数据

{“_id”:ObjectId(“5209eb465a721ae827c661de”),“title”:“Bina Kanalizasyon Tesisatı”,“parent”:“Su Tesisatçılığı”,“path”:“sutesitati/kanalizasyon”}

{“_id”:ObjectId(“5209eb465a721ae827c661df”),“title”:“Daire Temiz Su Tesisatı”,“parent”:“Su Tesisatçılığı”,“路径”:“sutesisati/temizsu”}

{“_id”:ObjectId(“5209eb465a721ae827c661e0”),“title”:“Musluk Tamiri”,“parent”:“Su Tesisatçılığı”,“path”:“sutesitati/musluktamiri”}

这是我的 Rails 模型

class Category
  include Mongoid::Document
  include Sunspot::Mongoid2

  searchable do
    text :title 
  end

  field :title, :as => :title_textp
  field :parent
  field :path  
end

这是我的 Rails 控制器

class CategoriesController < ApplicationController
  respond_to :html, :json

  def list_styles 
      search = Category.search do
        fulltext params[:q]
      end
      search = Category.search { keywords params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] }
      @results = search.results
      @total_lines = search.total
      @categories = @results    
     respond_with @categories 
  end 

end

这是我的哈姆尔观点

 = f.label :category
 = f.hidden_field :category, class: 'input-block', placeholder: "Lütfen almak istediğiniz hizmet türünü seçiniz"

这是我试图弄清楚的Javascript

$('#itinerary_category').select2({
    minimumInputLength: 3,
     ajax: {
      url: "/categories/list_styles",
      dataType: 'json',
      quietMillis: 100,
      data: function (term, page) { 
        return {
            q: term, 
            page_limit: 10, 
            page: page, 
        };
      },
    results: function (data) {
      var results = [];
      $.each(data, function(index, item){
        results.push({
          text: item.parent,
          children: [{id: item._id, text:item.title}]
        });
      });
      return {
          results: results
      };
    } 
    }
}); 

当我运行服务器并进行搜索时,对于包含一项的组,它的工作正常

搜索一项

但是,当我进行显示多个项目的搜索时,组名(“Su Tesisatı”)也会显示两次。

组显示两次

我不希望组名显示两次,而且我不知道如何进行更改。我想要一个像

Su Tesisatçılığı
  Daire Temiz Su Tesisatı
  Bina Kanalizasyon Tesisatı

我不擅长js,无法弄清楚如何解决它。有人可以帮我吗?我认为我提供的示例还增加了关于在 select2 中对远程数据进行分组的讨论,并清楚地说明了如何将 select2 与 rails+mongoid+solr+ajax 一起使用。如果有人可以清除这一点,那么这将使 select2 更强大,因为网络上几乎没有明确的示例可以使其与 ajax 远程数据进行分组。任何帮助将不胜感激。

4

1 回答 1

5

在此代码中,您正在为每个子项创建一个父项:

  $.each(data, function(index, item){
    results.push({
      text: item.parent,
      children: [{id: item._id, text:item.title}]
    });
  });

相反,您应该按父母分组:

  var hashtable={};
  var results=[];
  $.each(data, function(index, item){
     if (hashtable[item.parent]===undefined) {
         hashtable[item.parent]={text:item.parent, children:[]};
         results.push(hashtable[item.parent]);
     }
     hashtable[item.parent].children.push({id:item._id,text:item.title});
  });
于 2013-08-13T15:47:59.570 回答