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

Ruby on rails 根据记录的属性在下拉列表中拆分选项组?,ruby-on-rails,ruby,select,Ruby On Rails,Ruby,Select,我试图在下拉列表中将我的选项组分为两类:未分配和已分配 例如,如果这是我的数据(unassigned=false): 我希望它输出以下内容: <select name="city[country_id]"> <optgroup label="Unassigned"> <option value="2">Steven</option> <option value="3">Mary</option> &l

我试图在下拉列表中将我的选项组分为两类:未分配和已分配

例如,如果这是我的数据(unassigned=false):

我希望它输出以下内容:

<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中的集合\u select helper以及组helpers,但都没有成功。有什么rails助手方法可以做到这一点吗?如果没有,我如何生成此结果。

您可以为此使用。它将根据块产生的值在散列中对元素进行分组。我不知道您使用什么数据结构来存储数据,我假设我的答案是散列

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]}
或者,您可以使用,它根据传递的块的返回值将可枚举项划分为
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}]
# Partition data based on their 'assigned' value
data.partition { |name, assigned| assigned }.map { |partition| Hash[partition] }
# => [{:Bob=>true, :John=>true}, {:Steven=>false, :Mary=>false}]