我有一个应用程序可以根据数据库中的某些值动态创建下拉菜单。通常下拉值只是按照它们出现的顺序,但我想把它们按一定的顺序排列。
我的价值体系的一个例子:
Newbie = 0
Amateur = 1
Skilled = 2
Pro = 3
GrandMaster = 4
我将如何获取上面的数据并使用它来对充满这些值的数组进行排序(新手等)。我曾考虑过创建值的哈希值,但即便如此,我仍然不确定如何将其应用于该sort
方法。
任何帮助,将不胜感激。
我有一个应用程序可以根据数据库中的某些值动态创建下拉菜单。通常下拉值只是按照它们出现的顺序,但我想把它们按一定的顺序排列。
我的价值体系的一个例子:
Newbie = 0
Amateur = 1
Skilled = 2
Pro = 3
GrandMaster = 4
我将如何获取上面的数据并使用它来对充满这些值的数组进行排序(新手等)。我曾考虑过创建值的哈希值,但即便如此,我仍然不确定如何将其应用于该sort
方法。
任何帮助,将不胜感激。
您可以仅使用通常的排序方式对这个数组进行排序,排序不会按名称完成,而是按值完成。如果这些不是整数对象并且是一些用户定义的类,则可以通过以下方式非常有效地实现基于特定属性的排序
lst.sort_by &:first
其中 first 是对象的属性。
按值排序:
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 }
假设您有一个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)) %>
@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] } %>
由于我的问题解释不清,其他试图回答我的问题的人并没有真正得到机会,但在他们的帮助下,我确实设法找出了我的问题。
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"]
谢谢你们的帮助。非常感激。
解析您的价值系统以供进一步使用:
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}
根据为数组值分配权重,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}