Ruby 两级数组排序,其中一个第二级数组成员始终位于顶部
我有一个两级数组,每个元素中都有一个类别和一个子类别,如下所示:Ruby 两级数组排序,其中一个第二级数组成员始终位于顶部,ruby,database,sorting,ruby-on-rails-4,activerecord,Ruby,Database,Sorting,Ruby On Rails 4,Activerecord,我有一个两级数组,每个元素中都有一个类别和一个子类别,如下所示: category1 general subcategory1 subcategory2 category2 general subcategory1 subcategory2 subcategory3 [[类别1,子类别1],[类别1,子类别2],[类别2,子类别2],[类别3,子类别3]… 我在下拉列表中使用此选项,将显示如下列表: category1 general subcategory
category1
general
subcategory1
subcategory2
category2
general
subcategory1
subcategory2
subcategory3
[[类别1,子类别1],[类别1,子类别2],[类别2,子类别2],[类别3,子类别3]…
我在下拉列表中使用此选项,将显示如下列表:
category1
general
subcategory1
subcategory2
category2
general
subcategory1
subcategory2
subcategory3
基本上,我需要有“一般”子类别,以始终显示在子类别列表的顶部,如果有,按字母顺序排列。我将如何编写此代码
使用ActiveRecord,对数组本身进行字母排序相对容易:
ModelName.pull(:category,:subcategory).排序
但这不会将子类别“general”放在首位。它将按字母顺序排列。我更喜欢rails解决方案,但如果能帮我找到正确的方向,我将不胜感激。如果我是你,我会格式化DB查询结果,使其看起来像
{
"category1" => ["general", "subcategory1", "subcategory2", ...],
"category2" => ["general", "subcategory1", "subcategory2", ...],
...
}
如果“常规”
未存储在数据库中,则
ModelName.pluck(:category, :subcategory).sort.reduce(Hash.new{['general']}) do |hash, model|
hash[model[0]] <<= model[1]
end
是在
pulk
之后返回general,还是只是您希望在以后添加到每个类别中的内容?@ndn“general”当前是子类别之一。但它并不是出现在所有子类别中。我尝试过使用您的方法,但它似乎会将所有“常规”子类别取消到列表的顶部,而不是将它们保留在自己的类别中。@JCC,这没有意义。我在普赖尔试过了,效果很好。数组的比较从左到右比较元素。Aka它将首先按类别
进行比较,只有当类别相等时,才会按子类别
进行比较。我不确定发生了什么。我仔细检查了一下,它看起来确实提取了所有带有“常规”子类别的类别,并将它们放在列表的顶部。连秩序都没有。但是,列表的其余部分是按顺序排列的。@JCC,您能提供分类的准确输出吗?@JCC,顺便说一句,排序依据不在适当的位置。如果以后要使用分类
值,并希望根据上述规则对其进行排序,则应使用排序依据代码>取而代之。
categorization = ModelName.pluck(:category, :subcategory)
# => [["category1", "subcategory1"],
# ["category1", "subcategory2"],
# ["category1", "general"],
# ["category2", "general"],
# ["category2", "subcategory2"],
# ["category3", "subcategory3"],
# ["category3", "general"]]
categorization.sort_by! do |category, subcategory|
subcategory == 'general' ? [category, ''] : [category, subcategory]
end
# => [["category1", "general"],
# ["category1", "subcategory1"],
# ["category1", "subcategory2"],
# ["category2", "general"],
# ["category2", "subcategory2"],
# ["category3", "general"],
# ["category3", "subcategory3"]]