Rails mongoid solr将Select2中的远程ajax数据分组:当我搜索孩子时,Optgroup出现多次

时间:2013-08-13 12:51:43

标签: jquery-select2 select2-rails

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

这是我在Mongo DB中的数据

  

{“_ id”:ObjectId(“5209eb465a721ae827c661de”),“title”:“BinaKanalizasyonTesisatı”,“parent”:“SuTesisatçılığı”,“path”:“sutesitati / kanalizasyon”}

     

{“_ id”:ObjectId(“5209eb465a721ae827c661df”),“title”:“Daire TemizSuTesisatı”,“parent”:“SuTesisatçılığı”,“path”:“sutesisati / temizsu”}

     

{“_ id”:ObjectId(“5209eb465a721ae827c661e0”),“title”:“Musluk Tamiri”,“parent”:“SuTesisatçı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

这是我的Haml View

 = 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
      };
    } 
    }
}); 

当我运行服务器并进行搜索时,对于包含一个项目的组

,它可以正常工作

search for one item

然而,当我进行显示多个项目的搜索时,组名称(“SuTesisatı”)也会显示两次。

Group displayed twice

我不希望组名显示两次,我无法弄清楚如何进行更改。我想要一个像

这样的清单
Su Tesisatçılığı
  Daire Temiz Su Tesisatı
  Bina Kanalizasyon Tesisatı

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

1 个答案:

答案 0 :(得分: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});
  });