0

我有一个应用程序可以根据数据库中的某些值动态创建下拉菜单。通常下拉值只是按照它们出现的顺序,但我想把它们按一定的顺序排列。

我的价值体系的一个例子:

Newbie = 0
Amateur = 1
Skilled = 2
Pro = 3
GrandMaster = 4

我将如何获取上面的数据并使用它来对充满这些值的数组进行排序(新手等)。我曾考虑过创建值的哈希值,但即便如此,我仍然不确定如何将其应用于该sort方法。

任何帮助,将不胜感激。

4

6 回答 6

2

您可以仅使用通常的排序方式对这个数组进行排序,排序不会按名称完成,而是按值完成。如果这些不是整数对象并且是一些用户定义的类,则可以通过以下方式非常有效地实现基于特定属性的排序

lst.sort_by &:first

其中 first 是对象的属性。

于 2013-08-14T06:42:23.597 回答
1

按值排序:

hash = {:Newbie=>0, :Amateur=>1, :Skilled=>2, :Pro=>3}
> hash.sort { hash{a} <=> hash{b} }
=> [[:Newbie, 0], [:Amateur, 1], [:Skilled, 2], [:Pro, 3]] 

或者使用 Ruby Hash#sort_by 方法:

hash.sort_by { |k,v| v }
于 2013-08-14T06:39:12.903 回答
0

假设您有一个Level模型,该模型具有sort_id标识显示的订单和name持有显示的名称。我建议使用default_scope设置该模型的默认顺序,因为您可能总是希望以Level这种方式对记录进行排序:

class Level < ActiveRecord::Base
  #### attributes
  # id (integer)
  # name (string)
  # sort_id (integer)

  default_scope order('sort_id ASC')

  # rest of model...
end

然后,您在视图中唯一需要做的就是显示选项列表

<%= f.select("level", Level.pluck(:name)) %>
于 2013-08-14T06:47:51.060 回答
0

@padde 的替代品。我更喜欢避免使用默认范围。

class Level < ActiveRecord::Base
  #### attributes
  # id (integer)
  # name (string)
  # value (integer)
end

在视图中

<%= f.select("level", Level.order(:value).map{|l| [l.name, l.value] } %>
于 2013-08-14T07:13:45.073 回答
0

由于我的问题解释不清,其他试图回答我的问题的人并没有真正得到机会,但在他们的帮助下,我确实设法找出了我的问题。

ex_array = ["GrandMaster", "Newbie", "Pro", "Skilled", "Amateur"] 
value_sys = {:Newbie=>0, :Amateur=>1, :Skilled=>2, :Pro=>3, :GrandMaster=>4}

ex_array.sort { |a,b| value_sys[a.to_sym] <=> value_sys[b.to_sym]
=> ["Newbie", "Amateur", "Skilled","Pro", "GrandMaster"]

谢谢你们的帮助。非常感激。

于 2013-08-15T01:56:39.780 回答
-2
  1. 解析您的价值系统以供进一步使用:

    values = <<EOF
    Newbie = 0
    Amateur = 1
    Skilled = 2
    Pro = 3
    GrandMaster = 4
    EOF
    
    value_map = Hash[values.split("\n").map{|v| v.split(/\s*=\s*/)}.map{|v| [v[0], v[1].to_i]}]
    #=> {"Newbie"=>0, "Amateur"=>1, "Skilled"=>2, "Pro"=>3, "GrandMaster"=>4}
    
  2. 根据为数组值分配权重,value_map将数组转换为新数组,根据权重排序,然后将新数组转换回来。

    # here I created a sample array
    array = value_map.keys.shuffle
    #=> ["Newbie", "Pro", "Skilled", "Amateur", "GrandMaster"]
    
    # transform and sort
    sorted = array.map{|v| [v, value_map[v] || 0xFFFF]}.sort_by{|v| v[1]}.map{|v| v[0]}
    #=> ["Newbie", "Amateur", "Skilled", "Pro", "GrandMaster"]
    

    或者您可以绕过转换步骤并使用以下sort_by方法:

    sorted = array.sort_by{|v| value_map[v] || 0xFFFF}
    
于 2013-08-14T06:44:26.260 回答