Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 两级数组排序,其中一个第二级数组成员始终位于顶部_Ruby_Database_Sorting_Ruby On Rails 4_Activerecord - Fatal编程技术网

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