根据记录的属性在下拉列表中拆分选项组?

时间:2014-03-23 06:33:56

标签: ruby-on-rails ruby select

我正在尝试将下拉列表中的选项组拆分为两个类别,未分配和已分配。

例如,如果这是我的数据(未分配= 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帮助器以及组助手,但是一直没有成功。有没有铁路帮助方式来做到这一点?如果没有,我怎么能产生这个结果。

1 个答案:

答案 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}]