使用2级数组在ActiveAdmin中自定义筛选器

时间:2015-08-20 17:01:11

标签: arrays ruby-on-rails-4 activeadmin activemodel ransack

目前我有一个带过滤器的Case模型:

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"]

如何修改我的代码以使其正确显示? ransack对此有何影响?

2 个答案:

答案 0 :(得分:0)

return groups.map{|group| group.join(" ")}

答案 1 :(得分: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