我正在使用带有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
};
}
}
});
当我运行服务器并进行搜索时,对于包含一个项目的组
,它可以正常工作
然而,当我进行显示多个项目的搜索时,组名称(“SuTesisatı”)也会显示两次。
我不希望组名显示两次,我无法弄清楚如何进行更改。我想要一个像
这样的清单Su Tesisatçılığı
Daire Temiz Su Tesisatı
Bina Kanalizasyon Tesisatı
我不擅长js,也无法弄清楚如何解决它。有人可以帮帮我吗?我认为我提供的示例也增加了关于在select2中对远程数据进行分组的讨论,并明确说明如何将select2与rails + mongoid + solr + ajax一起使用。如果有人能够清除这一点,那么这将使select2更加强大,因为网上几乎没有明确的例子可以让它在使用ajax远程数据进行分组时工作。 任何帮助将不胜感激。
答案 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});
});