我正在尝试将下拉列表中的选项组拆分为两个类别,未分配和已分配。
例如,如果这是我的数据(未分配= false):
Bob, true
Steven, false
Mary, false
John, true
我希望它输出:
<select name="city[country_id]">
<optgroup label="Unassigned">
<option value="2">Steven</option>
<option value="3">Mary</option>
</optgroup>
<optgroup label="Assigned">
<option value="1">Bob</option>
<option value="4">John</option>
</optgroup>
</select>
我一直在尝试使用rails中的collection_select帮助器以及组助手,但是一直没有成功。有没有铁路帮助方式来做到这一点?如果没有,我怎么能产生这个结果。
答案 0 :(得分:0)
您可以使用Enumerable#group_by来实现此目的。它将根据块生成的值对Hash中的元素进行分组。我不知道你用来存储数据的数据结构,我假设我的答案是哈希。
data = {
Bob: true,
Steven: false,
Mary: false,
John: true
}
Hash[data.group_by { |_,v| v ? 'Assigned' : 'Unassigned' }.map { |k,v| [k, v.map(&:first)] }]
# => {"Assigned"=>[:Bob, :John], "Unassigned"=>[:Steven, :Mary]}
或者,您可以使用Enumerable#partition,它根据传递的块的返回值将Enumerable分区为true
数组和false
数组:
# Partition data based on their 'assigned' value
data.partition { |name, assigned| assigned }.map { |partition| Hash[partition] }
# => [{:Bob=>true, :John=>true}, {:Steven=>false, :Mary=>false}]