2015-08-20 28 views
1

目前,我有一個案例模型與過濾器:自定義過濾器使用2級陣列

filter :specialty, as: :select, collection: Specialty.order(:category, :name)

過濾器下拉菜單可顯示此:

category1 - name1 
category1 - General 
category1 - name2 
category2 - name1 
category2 - name2 
category2 - name3 

:name有一個字符串General這我總是希望成爲按字母順序排列的列表的頂部。因此,過濾器將始終按字母順序顯示:category,然後按字母順序顯示:name

我想這個下拉菜單顯示此:

category1 - General 
category1 - name1 
category1 - name2 
category2 - name1 
category2 - name2 
category2 - name3 

我決定寫在Case模型的方法,這樣我可以在AA過濾器這樣的中調用它:

filter :specialty, as: :select, collection: Specialty.my_method

my_method目前看起來是這樣的:

def self.my_method 
    groups = [] 

    category_list = Specialty.distinct(:category).pluck(:category, :name) 

    category_list.sort_by! do |category, name| 
     name == 'General' ? "#{category}, #{''}" : "#{category}, #{name}" 
    end 

    category_list.each do |category| 
     groups << [category, Specialty.where(category: category).order('name')] 
    end 

    return groups 
end 

的問題是,這表明下拉作爲一個數組,而不是字符串,它看起來像這樣:

["category1", "General"] 
["category1", "name1"] 
["category1", "name2"] 
["category2", "name1"] 
["category2", "name2"] 
["category2", "name3"] 

我將如何修改我的代碼,使之正確顯示? 快速搜索有什麼關係嗎?

回答

0

事實證明,我是過度查詢算法。這是使這個返回正確數組的代碼。

def self.my_method 
    all.sort_by do |specialty| 
    specialty.name == 'General' ? [specialty.category, ''] : 
    [specialty.category, specialty.name] 
    end 
end 

下拉現在顯示:

category1 - General 
category1 - name1 
category1 - name2 
category2 - name1 
category2 - name2 
category2 - name3 
0
return groups.map{|group| group.join(" ")} 
+0

謝謝,但不幸沒有返回正確的下拉列表中也是如此。它顯示了一些奇怪的對象,並將它們各自特定類別下的所有名稱作爲一個選項進行分組。 – JCC